当前位置: 首页 > news >正文

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

在 MySQL 中,将多行数据合并为 ​单个字段​ 可以使用聚合函数 GROUP_CONCAT()。这是处理「多行转单字段」场景(如合并列表、标签聚合等)的标准解决方案。以下是详细说明和示例:


核心语法

SELECT 分组字段,GROUP_CONCAT([DISTINCT] 合并字段 [ORDER BY 排序字段] [SEPARATOR '分隔符'])
FROM 表名
GROUP BY 分组字段;
  • DISTINCT:去重
  • ORDER BY:结果排序
  • SEPARATOR:自定义分隔符(默认逗号,

示例场景

原始数据表 user_skills
user_idskill
1Java
1Python
1SQL
2JavaScript
2HTML
目标:每个用户合并技能列表
user_idskills
1Java, Python, SQL
2JavaScript, 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_idskills
1Java / Python / SQL
2HTML / 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 DESCSEPARATOR ' | ') AS emp_data
FROM employees
GROUP BY department;

结果示例:

departmentemp_data
SalesBob:8500
ITTom:9500

通过 GROUP_CONCAT() 可以高效实现多行转单字段的需求,特别适合生成标签云、合并列表等业务场景。

http://www.lryc.cn/news/600813.html

相关文章:

  • 数据结构(4)单链表算法题(上)
  • 图解网络-小林coding笔记(持续更新)
  • 期货资管软件定制开发流程
  • write`系统调用
  • 宝塔面板如何升级OpenSSL
  • 哈尔滨←→南昌的铁路要道
  • IC测试之pogo pin学习与总结-20250726
  • 鲲鹏服务器部署Kafka2.8.1
  • 微服务springcloud http客户端feign
  • 【资讯】2025年软件行业发展趋势:AI驱动变革,云原生与安全成核心
  • 【Spring Cloud】微服务学习
  • LeetCode——1717. 删除子字符串的最大得分
  • 秋招Day20 - 微服务 - 概念
  • 【机器学习深度学习】模型微调:多久才算微调完成?——如何判断微调收敛,何时终止训练
  • 二维数组相关学习
  • 大模型蒸馏(distillation)---从DeepseekR1-1.5B到Qwen-2.5-1.5B蒸馏
  • UniappDay03
  • 【Canvas与旗帜】条纹版大明三辰旗
  • AI是否会终结IT职业?深度剖析IT行业的“涌现”与重构
  • 慧星云新增大模型服务:多款大模型轻松调用
  • C++:STL中vector的使用和模拟实现
  • MySQL的底层原理--InnoDB数据页结构
  • 人大金仓 kingbase 连接数太多, 清理数据库连接数
  • 基于匿名管道的多进程任务池实现与FD泄漏解决方案
  • VUE2 学习笔记7 v-model、过滤器
  • 6.数组和字符串
  • ChatIm项目文件上传与获取
  • 拉普拉斯方程的径向解法
  • opencv学习(图像金字塔)
  • DriverManager在rt.jar里,凭什么能加载到classpath下的驱动?