我有两个表用户和日志。我想用日志加入用户表并获取最新的日志条目。我注意到,按组内的行使用组不会被排序。因此,我无法检索最新的日志行。
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
有任何想法建议如何编写将返回正确结果的查询?
答案 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排序并不安全,不需要总是先记录,身份较小..这取决于。所以总是有一个安全的第二排列,比如重量等等代表“时间”或你自己的自定义等级。