核心函數
GROUP_CONCAT(expr) 將分組內非 NULL 的表達式值連接成單一字串,常用於「一對多」關係下將子表多行聚合為主表單行。
完整語法
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
關鍵選項說明
| 選項 | 作用 | 預設值 |
DISTINCT | 去除重複值 | 不去重 |
ORDER BY | 指定連接前的排序 | 無序 |
SEPARATOR | 自定義分隔符 | 逗號 ',' |
實戰範例
基本用法:學生成績聚合
SELECT student_name,
GROUP_CONCAT(test_score)
FROM student
GROUP BY student_name;
進階:去重 + 降序 + 自定義分隔符
SELECT student_name,
GROUP_CONCAT(DISTINCT test_score
ORDER BY test_score DESC
SEPARATOR ' ')
FROM student
GROUP BY student_name;
長度限制與調整
結果長度受系統變數 group_concat_max_len 限制 (默認 1024 字節)。超長會被截斷。
調整方法:
-- 當前會話
SET SESSION group_concat_max_len = 10000;
-- 全域 (需重啟或配置文件永久生效)
SET GLOBAL group_concat_max_len = 10000;
應用場景
- 訂單商品名稱彙總:
GROUP_CONCAT(product_name SEPARATOR '、')
- 用戶標籤聚合:
GROUP_CONCAT(tag_name ORDER BY tag_id)
- 報表導出:將多行明細合併為單元格內容
- 標籤雲、分類路徑拼接等
注意事項
- 僅聚合 非 NULL 值,NULL 會被忽略
- 超過
group_concat_max_len 會靜默截斷,無報錯,務必按需調大
- 大量數據聚合可能消耗較多記憶體,避免在無索引大表上濫用
- 配合
GROUP BY 使用,確保分組邏輯正確
- 上一篇文章: MySQL 服務啟動失敗錯誤 1067:端口佔用排查實戰
- 下一篇文章: MySQL 事務完整指南:ACID 特性、語法流程與實戰演示
Copyright ©
程式碼之家 All Rights Reserved