在MySQL里,当使用GROUP BY对数据进行分组后,有时希望把每个组内的某列多行文本拼成一条记录返回。GROUP_CONCAT聚合函数就是专门做这件事的,而且它允许我们自己定义连接时使用的分隔符,非常灵活。

GROUP_CONCAT基本语法
GROUP_CONCAT的完整语法如下:
SELECT dept_id, GROUP_CONCAT(user_name) AS names FROM employee GROUP BY dept_id;
上面语句会把每个部门的用户名用默认逗号连起来。如果我们不想用逗号,就要用到SEPARATOR。
指定自定义分隔符
通过SEPARATOR关键字,可以明确写出分组后文本之间用什么字符间隔:
SELECT dept_id, GROUP_CONCAT(user_name SEPARATOR '|') AS names FROM employee GROUP BY dept_id;
这样同一部门的名字就会用竖线隔开,例如 张三|李四|王五。
结合排序与去重
GROUP_CONCAT还支持在合并前先排序或去重,写法如下:
SELECT dept_id, GROUP_CONCAT(DISTINCT user_name ORDER BY user_name ASC SEPARATOR '; ') AS names FROM employee GROUP BY dept_id;
这段代码先对名字去重,再按字母序排列,最后用分号加空格连接。
长度限制问题
GROUP_CONCAT的结果长度受系统变量group_concat_max_len控制,默认值通常偏小。如果合并文本很长被截断,可临时调整:
SET SESSION group_concat_max_len = 100000;
设置后再执行查询,就能返回更长的合并内容。
常见使用场景
- 后台报表中把订单下的多个商品名合并展示
- 接口直接返回某分类下的所有标签文本
- 日志统计时将同一IP的访问路径拼成一个字段
合理利用GROUP_CONCAT与SEPARATOR,可大幅简化应用层字符串拼接的逻辑。
MySQLGROUP_CONCAT分组合并修改时间:2026-07-28 19:36:19