mysql group by 多个行转换为一个字段
作者:悟能不能悟
本文主要介绍了mysql group by 多个行转换为一个字段,可以使用聚合函数GROUP_CONCAT()函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
在 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 DESC SEPARATOR ' | ' ) AS emp_data FROM employees GROUP BY department;
结果示例:
department | emp_data |
---|---|
Sales | Bob:8500 |
IT | Tom:9500 |
通过 GROUP_CONCAT() 可以高效实现多行转单字段的需求,特别适合生成标签云、合并列表等业务场景。
到此这篇关于mysql group by 多个行转换为一个字段的文章就介绍到这了,更多相关mysql group by 转换为一个字段内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!