mysql group by 多个行转换为一个字段
在 MySQL 中,将多行数据合并为 单个字段 可以使用聚合函数 GROUP_CONCAT()
。这是处理「多行转单字段」场景(如合并列表、标签聚合等)的标准解决方案。以下是详细说明和示例:
核心语法
SELECT 分组字段,GROUP_CONCAT([DISTINCT] 合并字段 [ORDER BY 排序字段] [SEPARATOR '分隔符'])
FROM 表名
GROUP BY 分组字段;
DISTINCT
:去重ORDER BY
:结果排序SEPARATOR
:自定义分隔符(默认逗号,
)
示例场景
原始数据表 user_skills
user_id | skill |
---|---|
1 | Java |
1 | Python |
1 | SQL |
2 | JavaScript |
2 | HTML |
目标:每个用户合并技能列表
user_id | skills |
---|---|
1 | Java, Python, SQL |
2 | JavaScript, HTML |
实现 SQL
SELECT user_id,GROUP_CONCAT(skill SEPARATOR ', ') AS skills
FROM user_skills
GROUP BY user_id;
高级用法
1. 结果去重 + 排序
SELECT user_id,GROUP_CONCAT(DISTINCT skill ORDER BY skill ASC -- 按字母升序排序SEPARATOR ' / ') -- 自定义分隔符
FROM user_skills
GROUP BY user_id;
结果:
user_id | skills |
---|---|
1 | Java / Python / SQL |
2 | HTML / JavaScript |
2. 关联表合并字段(多表 JOIN)
SELECT u.user_id,u.user_name,GROUP_CONCAT(s.skill) AS skills
FROM users u
JOIN user_skills s ON u.user_id = s.user_id
GROUP BY u.user_id, u.user_name;
⚠️ 重要参数
GROUP_CONCAT()
受系统变量限制:
长度限制:默认 1024 字符
-- 临时调高限制(当前会话有效) SET SESSION group_concat_max_len = 1000000;
截断处理:超过长度时自动截断(不会报错)
对比其他方案
方法 | 适用场景 | 特点 |
---|---|---|
GROUP_CONCAT() | 多行合并为单字段(字符串) | 灵活的分隔符和排序控制 |
子查询 + JSON_ARRAY() | 需要结构化数据输出 | MySQL 5.7+ 支持 |
应用层代码处理 | 复杂合并逻辑 | 更灵活但增加网络传输 |
复杂案例:合并多列数据
SELECT department,GROUP_CONCAT(CONCAT(employee_name, ':', salary) -- 合并姓名和薪资ORDER BY salary DESCSEPARATOR ' | ') AS emp_data
FROM employees
GROUP BY department;
结果示例:
department | emp_data |
---|---|
Sales | Bob:8500 |
IT | Tom:9500 |
通过 GROUP_CONCAT()
可以高效实现多行转单字段的需求,特别适合生成标签云、合并列表等业务场景。