Sqlite对group by中的行进行了排序

时间:2012-04-08 08:40:55

标签: sqlite

我有两个表用户和日志。我想用日志加入用户表并获取最新的日志条目。我注意到,按组内的行使用组不会被排序。因此,我无法检索最新的日志行。

USER:

 ID    |   Name
--------------------
  1    |   John    
  2    |   Mike    

LOG:

L_ID | ACTION  | DATE     | USERID
----------------------------------
1    | OPEN    | '1 DEC'  |   1
2    | CLOSE   | '3 DEC'  |   1
3    | WRITE   | '2 DEC'  |   1
4    | OPEN    | '5 DEC'  |   2
5    | CLOSE   | '3 DEC'  |   2

有了这张表,我希望得到的结果是:

2 Mike 4 OPEN  '5 DEC'
1 Jhon 2 CLOSE '3 DEC'

我知道以下查询无效,因为组内的行未排序:

Select * from user join log on ID=USERID group by ID order by DATE DESC,L_ID

以下情况也不起作用,因为只返回正确的日期而不是操作:

Select ID,Name,Action,Max(Date) from user join log on ID=USERID group by ID order by DATE DESC, L_ID

有任何想法建议如何编写将返回正确结果的查询?

2 个答案:

答案 0 :(得分:1)

或者我也找到了问题的解决方案,但可能我的解决方案是“有风险的”,因为它依赖于未记录的假设。我注意到group by将该组的最新行作为参考行。所以我所做的是将查询拆分为2并确保我想通过group by引用的行是第一个查询的最新行:

Select * from (
               Select * from user join log on ID=USERID order by DATE,L_ID
              )
        group by ID order by DATE DESC

答案 1 :(得分:0)

这非常简单:

SELECT u.*, l.* 
FROM user AS u 
INNER JOIN log AS l ON l.USERID=u.ID 
WHERE l.DATE = (SELECT max(DATE) FROM log WHERE l.USERID=u.ID ORDER BY L_ID DESC LIMIT 1)

2 Mike 4 OPEN  '5 DEC'
1 Jhon 2 CLOSE '3 DEC'

这应该在MySQL中工作,因此sqlite太希望..这可能不是最好的优化,我希望看到有更多知识渊博的人给出确切的查询。

这假设您的日期字段是正确的日期时间字段而不是字符串。这些links might为您提供了更多想法。

请注意,按ID排序并不安全,不需要总是先记录,身份较小..这取决于。所以总是有一个安全的第二排列,比如重量等等代表“时间”或你自己的自定义等级。