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

MySQL使用MAX(datetime)分组查询时如何额外返回type列

问题原因说明

你之前两种写法报错的原因如下:

  • 第一种写法错误是因为MySQL开启了ONLY_FULL_GROUP_BY SQL模式(MySQL 5.7及以上版本默认开启),要求SELECT子句中所有非聚合函数的列,必须全部出现在GROUP BY子句中。你只按id分组,但SELECT了非聚合的type列,不符合规则所以触发错误。
  • 第二种写法错误是因为id AND type是逻辑与运算,返回的是布尔值结果,不是同时查询id和type两列的正确写法,语法逻辑完全错误。
正确实现方案

方案1:同id下所有记录的type值一致时使用

如果id=2的所有记录type字段值都相同,直接把type加入GROUP BY子句即可:

SELECT id, type, MAX(datetime) AS most_recent_sign_event 
FROM ATTENDANCE 
WHERE id = 2 
GROUP BY id, type;

方案2:同id下存在不同type值,需取最大datetime对应的type时使用

写法A:MySQL 8.0及以上支持窗口函数版本

使用ROW_NUMBER()窗口函数按时间倒序排序取第一条即可:

SELECT id, type, datetime AS most_recent_sign_event
FROM (
    SELECT 
        id, 
        type, 
        datetime,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY datetime DESC) AS rn
    FROM ATTENDANCE
    WHERE id = 2
) t
WHERE rn = 1;

写法B:兼容MySQL 5.x低版本

使用关联子查询先拿到最大时间,再关联原表拿到对应type:

SELECT a.id, a.type, a.datetime AS most_recent_sign_event
FROM ATTENDANCE a
INNER JOIN (
    SELECT id, MAX(datetime) AS max_dt
    FROM ATTENDANCE
    WHERE id = 2
    GROUP BY id
) b ON a.id = b.id AND a.datetime = b.max_dt
WHERE a.id = 2;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:06:02