MySQL GROUP_CONCAT:分组后控制关联列取最大值的实现问询
解决分组后取
anotherNumber最大值并保留GROUP_CONCAT(number)的方案 针对你的需求,我提供两种常用的解决思路,适配不同的场景:
方法一:直接使用聚合函数(简单高效,适合不需要id的场景)
如果你的需求只需要分组后的number、该组最大的anotherNumber,以及拼接的number列表,直接用MAX()聚合函数配合GROUP_CONCAT()即可,这是最简洁的写法:
SELECT number, MAX(anotherNumber) AS anotherNumber, GROUP_CONCAT(number) AS number_list FROM docs GROUP BY number;
执行这个查询后,结果会是:
| number | anotherNumber | number_list |
|---|---|---|
| 1 | 20 | 1,1 |
| 2 | 20 | 2,2 |
| 3 | 10 | 3 |
为什么这个可行?因为MAX(anotherNumber)会明确提取每组中anotherNumber的最大值,而GROUP_CONCAT(number)会按照分组拼接所有number值,完全符合你的需求。
方法二:使用窗口函数(适合需要保留对应最大值整条记录的场景)
如果你需要同时保留对应anotherNumber最大值的那条记录的id(或其他字段),可以用MySQL 8.0及以上支持的窗口函数来实现:
WITH ranked_docs AS ( SELECT *, -- 按number分组,给每组内的记录按anotherNumber降序排名 ROW_NUMBER() OVER (PARTITION BY number ORDER BY anotherNumber DESC) AS rn, -- 提前按分组拼接number列表 GROUP_CONCAT(number) OVER (PARTITION BY number) AS number_list FROM docs ) -- 只取每组排名第一(即anotherNumber最大)的记录 SELECT id, number, anotherNumber, number_list FROM ranked_docs WHERE rn = 1;
这个查询的结果会是:
| id | number | anotherNumber | number_list |
|---|---|---|---|
| 2 | 1 | 20 | 1,1 |
| 3 | 2 | 20 | 2,2 |
| 5 | 3 | 10 | 3 |
补充说明
原来的SELECT *, GROUP_CONCAT(number) FROM docs GROUP BY number之所以得到非最大值的anotherNumber,是因为MySQL在开启ONLY_FULL_GROUP_BY时会报错(不符合SQL标准),关闭后会随机返回分组内某条记录的anotherNumber值,这是不可控的。而上面两种方法都是符合SQL规范的可靠写法。
内容的提问来源于stack exchange,提问作者Björn
相关产品推荐
相关产品推荐

