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

SQL中GROUP BY分组时如何获取每个分组最新ID对应的记录

问题根因

你的原查询无法返回预期结果,是因为写法本身不符合SQL标准:子查询中直接SELECT * FROM mycp GROUP BY ttype时,没有通过聚合逻辑明确指定要取分组内ID最大的行,在MySQL非严格模式下,这种写法会默认返回分组内物理存储位置最靠前的记录,因此Business 1分组返回了最早插入的ID=1的John数据,而非最新的ID=6的Patrick数据。

解决方案

通用兼容写法(支持所有SQL数据库版本)

核心逻辑是先聚合查出每个ttype分组对应的最大ID,再通过关联原表拿到最大ID对应的完整行数据,最后套入你需要的筛选、排序、分页规则:

SELECT m.*
FROM mycp m
INNER JOIN (
    -- 第一步:拿到每个分组的最新ID
    SELECT ttype, MAX(ID) AS latest_id
    FROM mycp
    GROUP BY ttype
) t ON m.ttype = t.ttype AND m.ID = t.latest_id
-- 你原有的筛选条件
WHERE m.PlayerName = 'Mark_Fletcher' OR m.fbk = 14
ORDER BY m.ID ASC
LIMIT 10;

基于你提供的测试数据执行该语句,会得到你预期的结果:Business 1分组匹配到最大ID=6,返回Patrick对应的记录,其余分组也均返回对应ttype下ID最大的行。

MySQL 8.0+ 窗口函数写法

如果你的数据库版本支持窗口函数(MySQL 8.0及以上、PostgreSQL等),可以用ROW_NUMBER()实现,逻辑更简洁,适合多维度排序取最新值的场景:

SELECT *
FROM (
    SELECT
        *,
        -- 按ttype分区,同分组内按ID倒序编号,最新ID的编号为1
        ROW_NUMBER() OVER (PARTITION BY ttype ORDER BY ID DESC) AS rn
    FROM mycp
) t
WHERE rn = 1 -- 只取每个分组ID最大的行
AND (PlayerName = 'Mark_Fletcher' OR fbk = 14)
ORDER BY ID ASC
LIMIT 10;
避坑提示
  • 不要在GROUP BY语句中直接查询非聚合、非分组字段,这种写法仅在旧版MySQL非严格模式下能执行,返回结果完全不可控,新版本或其他数据库会直接抛出语法错误。
  • 如果业务上存在同分组同最大ID的重复数据,关联写法会返回所有匹配的重复行,如果仅需要单条记录,可以根据业务需求加去重规则,或使用窗口函数写法控制返回行数。

内容的提问来源于stack exchange,提问作者Mister Caligiuri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:48:13