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

MySQL GROUP_CONCAT 將多行合併為單行:完整語法與實戰

     編輯:MySQL 資料庫相關知識

核心函數


GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC]]
             [SEPARATOR str_val])

返回分組內非 NULL 值拼接字串,預設分隔符 ,。

基本範例


-- 學生姓名 + 所有考試分數
SELECT student_name,
       GROUP_CONCAT(test_score ORDER BY test_score DESC SEPARATOR ';') AS scores
FROM student
GROUP BY student_name;

進階用法

需求寫法
去重GROUP_CONCAT(DISTINCT col)
自定義分隔符GROUP_CONCAT(col SEPARATOR '|')
排序後拼接GROUP_CONCAT(col ORDER BY col DESC)
多欄位拼接GROUP_CONCAT(CONCAT(col1,':',col2))
限制長度SET SESSION group_concat_max_len = 1000000;

實戰:一對多關聯查詢扁平化


-- 訂單 + 所有商品名
SELECT o.order_id,
       GROUP_CONCAT(g.goods_name SEPARATOR ',') AS goods_list
FROM `order` o
JOIN order_item oi ON o.order_id = oi.order_id
JOIN goods g ON oi.goods_id = g.goods_id
GROUP BY o.order_id;

注意事項

  • 結果長度受 group_concat_max_len 限制(預設 1024 位元組),超長會截斷,務必按需調大。
  • NULL 值自動忽略,若需保留可用 IFNULL(col,'')。
  • 大量資料拼接可能消耗大量記憶體,建議在應用層分頁處理或用 JSON_ARRAYAGG(MySQL 5.7+)輸出結構化陣列。

JSON_ARRAYAGG 替代方案(MySQL 5.7+)


SELECT o.order_id,
       JSON_ARRAYAGG(g.goods_name) AS goods_json
FROM `order` o
JOIN order_item oi ON o.order_id = oi.order_id
JOIN goods g ON oi.goods_id = g.goods_id
GROUP BY o.order_id;
-- 輸出:["商品A","商品B"]  直接給前端解析,避免分隔符衝突

GROUP_CONCAT 是報表、匯出、搜尋聚合的利器,配合 SEPARATOR、ORDER BY、group_concat_max_len 靈活應對各種場景。

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