MySQL使用MAX(datetime)分组查询时如何额外返回type列
问题原因说明
你之前两种写法报错的原因如下:
- 第一种写法错误是因为MySQL开启了
ONLY_FULL_GROUP_BYSQL模式(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
相关产品推荐
相关产品推荐

