MySQL Group By问题:如何按NewID去重获取对应最大id记录
MySQL按NewID去重保留最高id的查询调整方案
基础场景
现有tb_detail表结构与测试数据如下:
id NewID SenderID ReceiverID msg msgType TimeStamp 1 5 9 8 dfdf 1 7-03-2021 6:10 AM 2 4 9 8 dfdf 1 7-03-2021 6:11 AM 3 3 9 8 dfdf 1 7-03-2021 6:13 AM 4 5 9 8 fgdf 1 7-03-2021 6:16 AM
需要实现的查询目标:
- 按
NewID维度去重,每个NewID仅保留对应最高id的记录,剔除冗余重复数据 - 结果集按最高id值倒序排列,最高id的记录排在最前端
- 输出字段为聚合得到的最高id(别名
_maxid)、对应的NewID,匹配如下预期结果:_maxid NewID 4 5 3 3 2 4
现有查询的问题根源
当前执行的语句:
SELECT MAX(id) _maxid , NewID FROM tb_detail GROUP BY id ORDER BY id DESC
错误点在于分组维度选错了:语句按id字段分组,而id是主键、每个值唯一,相当于每行单独成一组,MAX(id)的计算结果自然等于分组自身的id值,根本没有对重复的NewID做聚合过滤,最终才会把id=1、NewID=5的重复冗余记录也查出来,和预期不符。
正确的调整写法
核心改动是把分组维度从id替换为需要去重的NewID,让数据库先按NewID聚合计算每个分组的最大id,再按最大id倒序排列:
SELECT MAX(id) AS _maxid, NewID FROM tb_detail GROUP BY NewID ORDER BY _maxid DESC;
语句执行后完全匹配预期结果:
- NewID=5分组下的最大id为4
- NewID=3分组下的最大id为3
- NewID=4分组下的最大id为2
- 按_maxid倒序排序后,输出顺序和预期完全一致。
补充:如果后续需要获取这些最大id对应的全量表字段(比如msg、时间戳等完整记录),可以将上述聚合结果作为临时集,通过id关联原表取对应行的全量数据即可。
内容的提问来源于stack exchange,提问作者user2372925
相关产品推荐
相关产品推荐

