当前位置: 首页 > 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.dtcms.com/a/299030.html

相关文章:

  • Java动态调试技术原理
  • Oracle 11g RAC数据库实例重启的两种方式
  • 机器学习——随机森林算法分类问题案例解析(sklearn)
  • SpringMVC——建立连接
  • Python高级入门Day6
  • (React入门上手——指北指南学习(第一节)
  • Earth靶机攻略
  • 公域流量向私域流量转化策略研究——基于开源AI智能客服、AI智能名片与S2B2C商城小程序的融合应用
  • 分治算法 (Divide and Conquer)原理、及示例-JS版
  • 告别配置混乱!Spring Boot 中 Properties 与 YAML 的深度解析与最佳实践
  • C++查询mysql数据
  • linux下变更mysql的数据文件目录
  • CentOS 7 安装 MySQL 8.4.6(二进制包)指南
  • 基于MySQL实现基础图数据库
  • Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
  • GMP模型
  • 背包问题及 LIS 优化
  • 口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)
  • vue子组件关闭自己的方式(事件触发)
  • 上证50指数分红和股指期货有什么关系?
  • MybatisPlus-18.插件功能-分页插件基本用法
  • Vue3 学习教程,从入门到精通,Vue3 样式绑定语法详解与案例(17)
  • 学习随想录-- web3学习入门计划
  • 【自动化运维神器Ansible】Ansible常用模块之File模块详解
  • 收银系统优惠功能架构:可扩展设计指南(含可扩展性思路与落地细节)
  • selenium自动化鼠标和键盘操作
  • 06-ES6
  • 【LLM】Kimi-K2模型架构(MuonClip 优化器等)
  • 详解力扣高频SQL50题之550. 游戏玩法分析 IV【中等】
  • qt c++ msvc2017编译器解决界面中中文乱码问题