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

MySQL GROUP_CONCAT 函數完全指南:從基礎語法到實戰避坑

     編輯:MySQL 綜合教學

核心概念

GROUP_CONCAT(expr [ORDER BY ...] [SEPARATOR 'str']) 將分組內非 NULL 值拼接為單字符串。必須配合 GROUP BY 使用,否則整張表視為一組,失去分組聚合意義。

基礎示例

-- 測試表 players(id, name, town, sex)
-- 數據:(1,'王滔','北京','男'),(2,'王小明','北京','男'),(3,'劉惠','長沙','女'),(4,'舒明','長沙','女')

-- ❌ 錯誤:無 GROUP BY,全表一組
SELECT GROUP_CONCAT(town) FROM players;
-- 結果:長沙,北京,北京,長沙  (無分組意義)

-- ✅ 正確:按 town 分組
SELECT GROUP_CONCAT(town) FROM players GROUP BY town;
-- 結果:
-- 北京,北京
-- 長沙,長沙

多列拼接行為

SELECT GROUP_CONCAT(name, sex) FROM players GROUP BY town;
-- 北京組:王滔男,王小明男
-- 長沙組:劉惠女,舒明女
-- ⚠️ 列值直接拼接無分隔,建議用 CONCAT(name, ':', sex) 再 GROUP_CONCAT

進階參數

子句作用示例
ORDER BY col組內排序GROUP_CONCAT(name ORDER BY id)
SEPARATOR '|'自定義分隔符(默認逗號)GROUP_CONCAT(id SEPARATOR '|')
DISTINCT去重GROUP_CONCAT(DISTINCT town)

實戰場景:一對多關係扁平化輸出

-- 訂單表 orders(id, user_id) + 訂單項 items(id, order_id, product_name)
-- 需求:每筆訂單一行,商品名拼接
SELECT 
    o.id AS order_id,
    GROUP_CONCAT(i.product_name ORDER BY i.id SEPARATOR ';') AS products
FROM orders o
LEFT JOIN items i ON o.id = i.order_id
GROUP BY o.id;

常見陷阱與對策

  1. 長度截斷:見前文 group_concat_max_len 方案。
  2. NULL 值被忽略:GROUP_CONCAT(IFNULL(col, 'N/A')) 保留佔位。
  3. 超大結果集導致 OOM:單組超 1MB 時改用應用層流式處理或 JSON_ARRAYAGG。
  4. 字符集不一致報錯:確保表、連接、結果字符集一致(均 utf8mb4)。

版本演進

  • MySQL 4.1+:引入 GROUP_CONCAT。
  • MySQL 5.7+:新增 JSON_ARRAYAGG、JSON_OBJECTAGG,輸出結構化數據,避免分隔符衝突。
  • MySQL 8.0:窗口函數 GROUP_CONCAT() OVER (PARTITION BY ...) 支持不分組聚合。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved