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+)輸出結構化陣列。
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 靈活應對各種場景。