HQL查询语句。 (在线等。)

姑娘出来我爬山坡 2013-06-26 02:12:59
表:用户id,桌子id,登录状态,登录时间,退出时间
select t from t_record t
where t.tableId = tableId and
t.logoutTime > startTime and
t.logoutTime < endTime and
not exit (select s from t_record s where s.loginTime >= t.logoutTime and t.tableId = tableId )


该桌子上的所有用户在定义的时间段中的最后一条记录,并且最后一条记录的登录状态一定要为离线。(该桌能有几个用户登录)
如果该桌上有2个用户在时间段中最后一条记录都为离线,那么就都查出来。如果只有1个用户的记录那就只查1条。

我的疑问(在时间段完成):
1、登录,退出,登录 那么这条记录会不会查出来。
2、登录,退出,(loginTime不跟前面退出的logoutTime相等)登录,退出 这样是否会把前面一个退出的记录也查出来。
3、这个HQL语句能否优化。(能的话帮下忙)
...全文
96 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 Imaor 的回复:

[code=sql]

declare @tableid int --假设一个tableid
--假设status=0 则为离线状态,status=1 则为登录状态,
;with cte_a(
select * from  [t_record] where (logoutTime between startTime and endTime) and tableid=@tableid and status=0
)

--分类取最后一条记录
,cte_b as(
select max(ID) ID,用户ID  from cte_a
group by 用户ID
)
--查询该时间段内登录状态的用户id
,cte_c as(
select userid from [t_record] where (loginTime between startTime and endTime) and tableid=@tableid and status=1
)
--结果
select * from  [t_record]  where ID in (select ID from cte_b) and userid not in (select userid from cte_c)
[/code]
谢谢 意思差不多了。 我修改一下就好了。
IEEE_China 2013-06-26
  • 打赏
  • 举报
回复

[code=sql]

declare @tableid int --假设一个tableid
--假设status=0 则为离线状态,status=1 则为登录状态,
;with cte_a(
select * from  [t_record] where (logoutTime between startTime and endTime) and tableid=@tableid and status=0
)

--分类取最后一条记录
,cte_b as(
select max(ID) ID,用户ID  from cte_a
group by 用户ID
)
--查询该时间段内登录状态的用户id
,cte_c as(
select userid from [t_record] where (loginTime between startTime and endTime) and tableid=@tableid and status=1
)
--结果
select * from  [t_record]  where ID in (select ID from cte_b) and userid not in (select userid from cte_c)
[/code]
  • 打赏
  • 举报
回复
引用 4 楼 Imaor 的回复:
[quote=引用 3 楼 u011206051 的回复:] 在时间段中 登录 退出 登录 这样的记录是不能查出来的。 只有在时间段最后一步为退出 这样才查出来
你的意思是 : 1、查询的时间段内,不查询这个状态的数据【登录-退出-登录】 2、也就是说,在查询的时间段内,登录状态的不查询。 是这个意思么?[/quote] 差不多。(一个桌上有可能多个用户登录,一个用户最后一条为登录状态这个用户的记录就不需要查出来。 另一个用户最后一条为退出状态,那么这一个用户的最后一条记录就要查出来)
IEEE_China 2013-06-26
  • 打赏
  • 举报
回复
引用 3 楼 u011206051 的回复:
在时间段中 登录 退出 登录 这样的记录是不能查出来的。 只有在时间段最后一步为退出 这样才查出来
你的意思是 : 1、查询的时间段内,不查询这个状态的数据【登录-退出-登录】 2、也就是说,在查询的时间段内,登录状态的不查询。 是这个意思么?
  • 打赏
  • 举报
回复
引用 2 楼 Imaor 的回复:

---丢了两句,自己加上。。,具体数值自己改
declare @tableid int --假设一个tableid
declare @status int --假设status=0 则为离线状态
set @tableid =1 ---这个加上
set @status=0 ---这个也加上
在时间段中 登录 退出 登录 这样的记录是不能查出来的。 只有在时间段最后一步为退出 这样才查出来
IEEE_China 2013-06-26
  • 打赏
  • 举报
回复

---丢了两句,自己加上。。,具体数值自己改
declare @tableid int --假设一个tableid
declare @status int --假设status=0 则为离线状态
set @tableid =1 ---这个加上
set @status=0 ---这个也加上
IEEE_China 2013-06-26
  • 打赏
  • 举报
回复

--首先明确一下,假设你的表有自动加1的ID字段;
--其次,每次登陆,都能正常退出;登陆一次就添加一次数据;
--第二次登陆的表ID大于第一次登陆的ID;
--第N次的退出时间 小于 第N+1次的登陆时间;
--只需要查询退出时间在你的时间段内就可以了。
--1、先查询 符合时间段的数据
declare @tableid int --假设一个tableid
declare @status int --假设status=0 则为离线状态
;with cte_a(
select * from  [t_record] where ([loginTime] between [startTime] and [endTime] and [tableid]=@tableid and [status]=@status)
)

--分类取最后一条记录
,cte_b as(
select max(ID) ID,用户ID  from cte_a
group by 用户ID
)

--最终查询
select * from  [t_record]  where ID in (select ID from cte_b)

---这样写比较明了了,
---

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧