日期:2014-05-17  浏览次数:20641 次

HQL查询语句。 (在线等。)
表:用户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语句能否优化。(能的话帮下忙) 
hql 性能优化 select

------解决方案--------------------

--首先明确一下,假设你的表有自动加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)

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