MySQL合并多条数据的核心方案
MySQL中实现多条数据合并成一条最常用的函数是GROUP_CONCAT,它可以将同一分组内的多个字段值拼接成一个字符串返回,配合GROUP BY分组语句就能快速完成合并需求。

基础合并示例
假设我们有一张用户标签表user_tag,表结构如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
| id | int | 主键 |
| user_id | int | 用户ID |
| tag_name | varchar(50) | 标签名称 |
表中现有数据如下:
| id | user_id | tag_name |
|---|---|---|
| 1 | 1001 | 编程 |
| 2 | 1001 | 阅读 |
| 3 | 1001 | 运动 |
| 4 | 1002 | 摄影 |
| 5 | 1002 | 旅行 |
现在需要将每个用户的所有标签合并成一条数据,使用GROUP_CONCAT的SQL语句如下:
-- 基础合并,默认用逗号分隔
SELECT
user_id,
GROUP_CONCAT(tag_name) AS tag_list
FROM user_tag
GROUP BY user_id;
执行上述语句后,得到的结果如下:
| user_id | tag_list |
|---|---|
| 1001 | 编程,阅读,运动 |
| 1002 | 摄影,旅行 |
自定义分隔符合并
如果默认的逗号分隔不符合需求,可以通过SEPARATOR关键字指定自定义分隔符,比如用竖线分隔:
-- 自定义分隔符为竖线
SELECT
user_id,
GROUP_CONCAT(tag_name SEPARATOR '|') AS tag_list
FROM user_tag
GROUP BY user_id;
执行后结果中的标签会用竖线分隔:编程|阅读|运动、摄影|旅行。
去重合并
如果同一分组下存在重复的字段值,需要去重后再合并,可以搭配DISTINCT关键字使用:
-- 去重后合并标签
SELECT
user_id,
GROUP_CONCAT(DISTINCT tag_name) AS tag_list
FROM user_tag
GROUP BY user_id;
排序后合并
如果需要按照指定顺序拼接字段值,可以在GROUP_CONCAT内部添加ORDER BY子句:
-- 按照标签名称升序排序后合并
SELECT
user_id,
GROUP_CONCAT(tag_name ORDER BY tag_name ASC) AS tag_list
FROM user_tag
GROUP BY user_id;
注意事项
- GROUP_CONCAT默认的最大拼接长度是1024字符,如果合并后的字符串超过这个长度会被截断,可以通过修改
group_concat_max_len参数调整长度:-- 设置最大拼接长度为10000 SET SESSION group_concat_max_len = 10000;
- 只有配合GROUP BY分组语句使用时,GROUP_CONCAT才能正确合并同一组的数据,如果没有分组,会将整张表的数据合并成一条。
- 如果合并的字段值为NULL,GROUP_CONCAT会自动忽略NULL值,不会将其拼接到结果中。
MySQL数据合并GROUP_CONCATSQL查询字符串拼接修改时间:2026-07-20 08:12:22