好的,阿杰 😄,我给你整理一份 MySQL GROUP_CONCAT 函数使用总结,从基本用法到高级技巧,帮你彻底理解这个函数。


📝 MySQL GROUP_CONCAT 函数详解

一、概念

  • GROUP_CONCAT() 是 聚合函数
  • 用于 将分组后的多行字段值连接成一个字符串
  • 常用于 将同组的多条记录合并显示

基本语法

GROUP_CONCAT([DISTINCT] expr
             [ORDER BY expr ASC|DESC]
             [SEPARATOR str])
参数说明
DISTINCT去重,去掉重复值
expr要连接的字段
ORDER BY排序(默认按字段顺序)
SEPARATOR str分隔符,默认逗号 ,

二、基本用法

1. 按组连接字段

SELECT department_id, GROUP_CONCAT(employee_name)
FROM employees
GROUP BY department_id;

输出示例:

department_id | GROUP_CONCAT(employee_name)
1             | Alice,Bob,Charlie
2             | David,Emma

2. 使用分隔符

SELECT department_id, GROUP_CONCAT(employee_name SEPARATOR '; ')
FROM employees
GROUP BY department_id;

输出:

1 | Alice; Bob; Charlie
2 | David; Emma

三、去重(DISTINCT)

SELECT department_id, GROUP_CONCAT(DISTINCT employee_name)
FROM employees
GROUP BY department_id;
  • 去掉重复员工名
  • 避免重复值累加

四、排序(ORDER BY)

SELECT department_id, GROUP_CONCAT(employee_name ORDER BY employee_name DESC)
FROM employees
GROUP BY department_id;
  • 按指定字段排序
  • 可使用 ASC 或 DESC

五、组合去重与排序

SELECT department_id, GROUP_CONCAT(DISTINCT employee_name ORDER BY employee_name ASC SEPARATOR '|')
FROM employees
GROUP BY department_id;

输出示例:

1 | Alice|Bob|Charlie
2 | David|Emma

六、长度限制

  • 默认最大长度 1024 字节
  • 可通过系统变量调整:
SET SESSION group_concat_max_len = 10000;
  • 适用于连接大量数据时避免截断

七、实战场景

  1. 把多行数据合并成一行
-- 查询每个订单的所有商品
SELECT order_id, GROUP_CONCAT(product_name ORDER BY product_name SEPARATOR ', ') AS products
FROM order_items
GROUP BY order_id;
  1. 生成标签列表
SELECT article_id, GROUP_CONCAT(tag_name) AS tags
FROM article_tags
GROUP BY article_id;
  1. 用于报表
  • 将多个记录合并显示在 Excel 或前端页面

八、小技巧

  1. 避免空值影响
SELECT GROUP_CONCAT(COALESCE(employee_name, 'N/A')) FROM employees;
  1. 结合 CONCAT 使用
SELECT department_id, GROUP_CONCAT(CONCAT(employee_name, '(', employee_id, ')'))
FROM employees
GROUP BY department_id;

输出示例:

Alice(1),Bob(2),Charlie(3)
  1. 结合子查询
SELECT department_id,
       (SELECT GROUP_CONCAT(employee_name) 
        FROM employees e2 
        WHERE e2.department_id = e1.department_id) AS emp_list
FROM departments e1;