2

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

用户:

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

日志:

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

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

4

2 回答 2

3

或者,我也找到了该问题的解决方案,但可能我的解决方案是“有风险的”,因为它依赖于未记录的假设。我注意到 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
于 2012-04-10T16:38:18.277 回答
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 也很有希望。这可能不是最好的优化,我希望看到更有知识的人给出确切的查询。

这假设您的日期字段是正确的日期时间字段而不是字符串。这些链接 可能会给您更多的想法。

另请注意,按 ID 排序是不安全的,它不一定总是第一个记录,较小的 id .. 这取决于。所以总是有一个安全的第二个排序列,比如重量左右,代表“时间”或您自己的自定义排名。

于 2012-04-08T11:52:34.480 回答