首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL GROUP_CONCAT 函數深度指南:語法、去重、排序、分隔符、長度限制與實戰案例

     編輯:MySQL 資料庫相關知識

完整語法

GROUP_CONCAT(
    [DISTINCT] expr
    [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC]]
    [SEPARATOR str_val]
)
  • DISTINCT:去重,默認不去重。
  • ORDER BY:組內排序,支持列、表達式、位置序號。
  • SEPARATOR:自定義分隔符,默認逗號 ','。

基礎示例

-- 測試表
CREATE TABLE aa (id INT, name VARCHAR(10));
INSERT INTO aa VALUES (1,10),(1,20),(1,20),(2,20),(3,200),(3,500);

-- 1. 默認逗號分隔
SELECT id, GROUP_CONCAT(name) FROM aa GROUP BY id;
-- 1 | 10,20,20
-- 2 | 20
-- 3 | 200,500

-- 2. 自定義分隔符
SELECT id, GROUP_CONCAT(name SEPARATOR ';') FROM aa GROUP BY id;
-- 1 | 10;20;20

-- 3. 去重
SELECT id, GROUP_CONCAT(DISTINCT name) FROM aa GROUP BY id;
-- 1 | 10,20

-- 4. 組內降序
SELECT id, GROUP_CONCAT(name ORDER BY name DESC) FROM aa GROUP BY id;
-- 1 | 20,20,10
-- 3 | 500,200

長度限制與調優

默認 group_concat_max_len = 1024 字節,超截斷且無報錯。

-- 會話級調大(推薦,不影響其他連接)
SET SESSION group_concat_max_len = 102400;  -- 100KB

-- 全局永久生效(需配置文件)
[mysqld]
group_concat_max_len = 102400

注意:結果仍受 max_allowed_packet 限制,極大聚合建議分批或應用層拼接。

進階實戰場景

1. 一對多關聯「標籤聚合」

SELECT 
    a.article_id,
    a.title,
    GROUP_CONCAT(t.tag_name ORDER BY t.tag_name SEPARATOR ',') AS tags
FROM article a
LEFT JOIN article_tag at ON a.article_id = at.article_id
LEFT JOIN tag t ON at.tag_id = t.tag_id
GROUP BY a.article_id, a.title;

2. 生成 IN 列表供動態 SQL 使用

SELECT GROUP_CONCAT(QUOTE(id)) FROM user WHERE status=1;
-- 輸出: '1','3','5','8'
-- 應用層拼接: SELECT * FROM order WHERE user_id IN (...)

3. 多字段拼接

SELECT 
    dept_id,
    GROUP_CONCAT(CONCAT(emp_name, ':', salary) ORDER BY salary DESC SEPARATOR ';') AS emp_salary_list
FROM employee
GROUP BY dept_id;

性能陷阱與優化

問題原因對策
臨時表/文件排序GROUP BY 無索引、數據量大建立 (group_col, sort_col) 聯合索引;適當增大 tmp_table_size/max_heap_table_size
結果截斷無感知超過 group_concat_max_len查詢前 SET SESSION group_concat_max_len=...;應用層檢查長度
內存暴漲單組聚合極大(如萬級標籤)業務拆分:改用子表存儲、應用層分頁拼接

總結

GROUP_CONCAT 是 MySQL 特有的強大聚合函數,善用 DISTINCT、ORDER BY、SEPARATOR 可完成「行轉列」、標籤聚合、動態 IN 列表等常見需求。核心注意點:調大 group_concat_max_len、警惕臨時表排序、極大聚合改用應用層處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved