[英]MySQL selecting last row from group by two columns
我试图从选择中的每个组中获取最新的行,但稍微扭曲一下。
获取下表作为示例:
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会给我想要的结果。
所以我需要以某种方式将id行添加到这个“组”机制中。 知道怎么做吗?
如果您选择哪一行并不重要,您可以按唯一行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
如果你用你的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;
(只需将id
替换为created_at
但如果你没有“正常”身份证,我认为没有办法做到这一点......
为什么你真的需要自我加入?
岂不
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分组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.