mysql group by 多个行转换为一个字段

发布于:2025-07-27 ⋅ 阅读:(12) ⋅ 点赞:(0)

在 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() 受系统变量限制:

  1. 长度限制​:默认 1024 字符

    -- 临时调高限制(当前会话有效)
    SET SESSION group_concat_max_len = 1000000;
  2. 截断处理​:超过长度时自动截断(不会报错)


对比其他方案

方法 适用场景 特点
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() 可以高效实现多行转单字段的需求,特别适合生成标签云、合并列表等业务场景。


网站公告

今日签到

点亮在社区的每一天
去签到