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

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;

执行这个查询后,结果会是:

numberanotherNumbernumber_list
1201,1
2202,2
3103

为什么这个可行?因为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;

这个查询的结果会是:

idnumberanotherNumbernumber_list
21201,1
32202,2
53103

补充说明

原来的SELECT *, GROUP_CONCAT(number) FROM docs GROUP BY number之所以得到非最大值的anotherNumber,是因为MySQL在开启ONLY_FULL_GROUP_BY时会报错(不符合SQL标准),关闭后会随机返回分组内某条记录的anotherNumber值,这是不可控的。而上面两种方法都是符合SQL规范的可靠写法。

内容的提问来源于stack exchange,提问作者Björn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:35:48