You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:56:34