0
点赞
收藏
分享

微信扫一扫

【mysql】GROUP_CONCAT 函数

一、基本概念

GROUP_CONCATMySQL 专属的聚合函数,核心作用是 将分组(GROUP BY 后)的多行数据,按规则拼接成单个字符串 ,常用于合并同组的关联信息,让结果更简洁直观,比如把同一用户的多个订单号合并展示。

二、语法结构

GROUP_CONCAT(
    [DISTINCT] 要拼接的字段/表达式  
    [ORDER BY 排序字段/表达式 [ASC/DESC]]  
    [SEPARATOR '自定义分隔符']
)

结合 GROUP BY 使用,完整查询语法:

SELECT 分组字段,
       GROUP_CONCAT(...) AS 别名  
FROM 表名  
GROUP BY 分组字段;

三、关键参数解析

参数

作用说明

示例场景

DISTINCT

可选,对拼接内容去重,避免重复值干扰

合并同一用户的不同订单号(去重重复订单)

要拼接的字段/表达式

必填,指定需合并的列,也能通过 CONCAT 等函数构造复杂拼接内容

GROUP_CONCAT(CONCAT(姓名, '-', 年龄))

ORDER BY

可选,控制拼接前数据的排序,让结果按规律排列

按时间倒序拼接操作日志

SEPARATOR

可选,默认用逗号(,)分隔,可自定义分隔符(如空格、分号、换行等)

; 分隔:SEPARATOR '; '

四、基础用法示例

假设有表 orders,结构和数据:

order_id

product

1

Apple

1

Orange

2

Banana

3

Apple

1. 最简拼接(默认逗号分隔)

SELECT order_id, 
       GROUP_CONCAT(product) AS products  
FROM orders  
GROUP BY order_id;

结果:

order_id

products

1

Apple,Orange

2

Banana

3

Apple

2. 自定义分隔符(用 , 分隔)

SELECT order_id, 
       GROUP_CONCAT(product SEPARATOR ', ') AS products  
FROM orders  
GROUP BY order_id;

结果:

order_id

products

1

Apple, Orange

2

Banana

3

Apple

3. 排序后拼接(按 product 升序)

SELECT order_id, 
       GROUP_CONCAT(product ORDER BY product ASC SEPARATOR ', ') AS products  
FROM orders  
GROUP BY order_id;

结果(因原数据已天然有序,效果同示例 2,若数据混乱则体现排序作用):

order_id

products

1

Apple, Orange

2

Banana

3

Apple

4. 去重拼接(若有重复 product 会去重)

假设 order_id=1 有重复 Apple,数据变为:

order_id

product

1

Apple

1

Apple

1

Orange

2

Banana

3

Apple

DISTINCT 去重:

SELECT order_id, 
       GROUP_CONCAT(DISTINCT product ORDER BY product ASC SEPARATOR ', ') AS products  
FROM orders  
GROUP BY order_id;

结果:

order_id

products

1

Apple, Orange

2

Banana

3

Apple

五、进阶场景扩展

1. 拼接复杂表达式(结合 CONCAT 构造格式)

user_ordersuser_idorder_noorder_date,需合并成 订单号(日期) 格式:

SELECT user_id, 
       GROUP_CONCAT(
           CONCAT(order_no, ' (', order_date, ')') 
           ORDER BY order_date DESC 
           SEPARATOR '; '
       ) AS order_info  
FROM user_orders  
GROUP BY user_id;

作用:按下单时间倒序,用 ; 分隔,清晰展示用户历史订单。

2. 处理 NULL 值(用 COALESCE 替换)

taskstask_iduser_idtask_note(可能为 NULL),需合并且替换 NULL[无备注]

SELECT user_id, 
       GROUP_CONCAT(
           COALESCE(task_note, '[无备注]') 
           SEPARATOR ' | '
       ) AS all_notes  
FROM tasks  
GROUP BY user_id;

作用:避免 NULL 导致拼接后缺失内容,统一替换让结果更规整。

六、注意事项

1. 长度限制(group_concat_max_len
  • MySQL 默认限制拼接结果长度(默认 1024 字节 ,可通过 SHOW VARIABLES LIKE 'group_concat_max_len'; 查看)。
  • 若拼接内容超长,结果会被 截断 !解决方法:

-- 临时生效(当前会话)
SET SESSION group_concat_max_len = 102400;  
-- 永久生效(需修改配置文件,重启服务)
# 在 my.cnf 或 my.ini 中添加  
group_concat_max_len = 102400

2. 性能影响
  • 处理 超大量数据 时,拼接操作会消耗较多内存和 CPU,可能拖慢查询。
  • 优化建议:
  • 尽量缩小查询范围(用 WHERE 过滤不必要数据);
  • 避免嵌套复杂表达式,简化拼接逻辑;
  • 确认是否真的需要合并所有数据,而非分开展示。
3. 与其他数据库差异
  • OracleLISTAGGSQL ServerSTRING_AGG,语法和细节不同,迁移需注意适配。
举报

相关推荐

0 条评论