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;
group_concat_max_len 方案。GROUP_CONCAT(IFNULL(col, 'N/A')) 保留佔位。JSON_ARRAYAGG。GROUP_CONCAT。JSON_ARRAYAGG、JSON_OBJECTAGG,輸出結構化數據,避免分隔符衝突。GROUP_CONCAT() OVER (PARTITION BY ...) 支持不分組聚合。