我试图从select中的每个组中获取最新的行,但稍微有点扭曲。
获取下表:
id , user_id , created_at , balance
1 , 1 , 2016-01-01 01:01:01 , 1
2 , 1 , 2016-01-01 01:01:01 , 2
你可以看到同一个用户的created_at
值是相同的,问题是我不能依赖id字段,因为没有什么可以保证最大的id将是最后一个之一。
如果created_at字段不会重复,则以下查询将正常工作:
SELECT L.id
, L.user_id
, L.created_at
, L.balance
FROM log AS L
JOIN
(SELECT user_id
, MAX(created_at) AS max_created_at
FROM log
GROUP BY user_id) MAX_TIME ON L.user_id = MAX_TIME.user_id
AND L.created_at = MAX_TIME.max_created_at;
但由于重复的created_at,它将返回两行。 所以我不能只依赖created_at字段,但我确信如果created_at是重复的,那么获取最大ID会给我想要的结果。
所以我需要在这个" group"中添加id行。机制。 知道怎么做吗?
答案 0 :(得分:0)
如果您选择哪一行无关紧要,您可以按唯一行ID进行排序,只选择顶部1.如果您想要最后行,即行最大的唯一ID,您需要ORDER BY ... DESC
SELECT TOP 1
L.id
, L.user_id
, L.created_at
, L.balance
FROM log AS L
JOIN
(SELECT user_id
, MAX(created_at) AS max_created_at
FROM log
GROUP BY user_id) MAX_TIME ON L.user_id = MAX_TIME.user_id
AND L.created_at = MAX_TIME.max_created_at;
ORDER BY L.id DESC
答案 1 :(得分:0)
如果你用你的ID创建了你的表作为auto_increment(我强烈推荐这种方式),最大的一行应该是最新的一行......
所以:
SELECT L.id
, L.user_id
, L.created_at
, L.balance
FROM log AS L
JOIN
(SELECT user_id
, MAX(id) AS last
FROM log
GROUP BY user_id) MAX_TIME ON L.user_id = MAX_TIME.user_id
AND L.id = MAX_TIME.last;
(只需将created_at
替换为id
但如果你没有"正常" ID,我认为没有办法做到这一点......
答案 2 :(得分:0)
为什么你真的需要自我加入?
岂不
SELECT L.id
, L.user_id
, L.created_at
, L.balance
FROM log AS L
GROUP BY L.user_id
ORDER BY L.created_at DESC, L.id DESC;
获得预期的行?
说明:首先进行排序,这样最新的日期时间已经在第一行。由于重复日期时间值的可能性,我们通过id添加另一个排序。现在,具有最新日期时间和最高ID的行将位于第一行,然后结果按用户ID分组。