MySQL排序分组查询求助:按ID降序且按Phone分组的正确写法
解决MySQL按Phone分组并取每个组最新记录的问题
嘿,我来帮你搞定这个查询问题~
首先得说下你原来的语句为什么不对:select * from messages where 1 group by phone order by ID desc 里,MySQL的执行顺序是先分组(GROUP BY),再排序(ORDER BY)。分组的时候,在非严格SQL模式下,MySQL会返回每组的第一条记录(不是你想要的最大ID那条),之后再排序,自然得不到预期的结果。
想要实现「每个Phone分组,取该组内ID最大的记录,最后整体按ID降序排列」,有两种常用的方法,看你的MySQL版本选就行:
方法1:子查询+关联查询(兼容所有MySQL版本)
这种方法先找出每个Phone对应的最大ID,再和原表关联拿到完整记录:
SELECT m.* FROM messages m INNER JOIN ( -- 先获取每个手机号的最大ID SELECT phone, MAX(id) AS max_id FROM messages GROUP BY phone ) t ON m.phone = t.phone AND m.id = t.max_id -- 最后整体按ID降序排序 ORDER BY m.id DESC;
方法2:窗口函数(MySQL 8.0及以上版本推荐)
如果你的MySQL版本是8.0或更高,用窗口函数会更简洁直观:
SELECT id, phone, content, create_time FROM ( SELECT *, -- 按Phone分组,组内按ID降序编号,每条记录的序号是rn ROW_NUMBER() OVER (PARTITION BY phone ORDER BY id DESC) AS rn FROM messages ) t -- 取每个组里编号为1的记录(也就是ID最大的那条) WHERE rn = 1 ORDER BY id DESC;
这两种方法都能得到你预期的结果,窗口函数写法更清晰,子查询法则兼容更早的MySQL版本~
内容的提问来源于stack exchange,提问作者Defr
相关产品推荐
相关产品推荐

