首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL GROUP_CONCAT 實戰:多行合併為單行、去重、排序、自定義分隔符

     編輯:MySQL 綜合教學

核心語法

GROUP_CONCAT([DISTINCT] expr [ORDER BY {col|expr} [ASC|DESC]] [SEPARATOR 'sep'])

基礎範例 (表 aa: id, name)

idname
110
120
120
220
3200
3500

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
-- 2 | 20
-- 3 | 200;500

3. 去重 (DISTINCT)

SELECT id, GROUP_CONCAT(DISTINCT name) FROM aa GROUP BY id;
-- 1 | 10,20
-- 2 | 20
-- 3 | 200,500

4. 排序 (ORDER BY DESC)

SELECT id, GROUP_CONCAT(name ORDER BY name DESC) FROM aa GROUP BY id;
-- 1 | 20,20,10
-- 2 | 20
-- 3 | 500,200

5. 綜合:去重 + 排序 + 自定義分隔符

SELECT id, GROUP_CONCAT(DISTINCT name ORDER BY name DESC SEPARATOR '|') FROM aa GROUP BY id;
-- 1 | 20|10
-- 2 | 20
-- 3 | 500|200

實戰場景:聯表查詢合併關聯名稱

SELECT c.id, c.name,
       GROUP_CONCAT(DISTINCT t.tag_name ORDER BY t.tag_name SEPARATOR ',') AS tags
FROM contacts c
LEFT JOIN contact_tags ct ON c.id = ct.contact_id
LEFT JOIN tags t ON ct.tag_id = t.id
GROUP BY c.id, c.name;

關鍵限制與調優

限制預設值調整方式
group_concat_max_len1024 字節SET SESSION group_concat_max_len = 1000000;
max_allowed_packet4MB/1MB結果長度受限於此,需同步調大

**注意**:超過長度會**靜默截斷**,不報錯,務必按業務預估調大。

效能提示

  • 配合索引 (GROUP BY 欄位、ORDER BY 欄位) 避免 filesort
  • 大數據量慎用 DISTINCT (需臨時表去重)
  • 結果集較大時考慮應用層分頁拼接,避免單條 SQL 過大

善用 GROUP_CONCAT,一行搞定多行聚合輸出。

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