MySQL 的 GROUP_CONCAT() 函數是一個強大的聚合函數,它可以將分組中的多行數據合併為一個字串。這在報表生成、數據匯出、以及將關聯數據扁平化等場景中極為實用。基本語法如下:
GROUP_CONCAT([DISTINCT] expr [ORDER BY ...] [SEPARATOR str])
首先建立一張記錄各部門每週數據的表:
CREATE TABLE `departmentweekdata` ( `department` VARCHAR(20), `week` INT, `interval` INT, `count` INT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
插入測試數據(此處省略具體 INSERT 語句,假設表中已有 CAO、GBG1 等部門在第 1-3 週、不同 interval 下的 count 值)。
最簡單的用法是直接合併 count 列,預設以逗號分隔:
SELECT `department`, `interval`, GROUP_CONCAT(`count`) FROM `departmentweekdata` GROUP BY `department`, `interval`;
| department | interval | GROUP_CONCAT(count) |
|---|---|---|
| CAO | 1 | 1,1,1,0,1,2,2,0,0,1 |
| CAO | 2 | 0,0,1,1,2,0,2,0,0,0 |
| CAO | 3 | 1,1,0,0,0,1,0,0,1,0 |
| GBG1 | 1 | 0,0,0,0,0,0,0,0,0,0 |
| GBG1 | 2 | 0,0,0,0,0,0,0,0,0,0 |
| GBG1 | 3 | 0,0,0,0,0,0,0,0,0,0 |
使用 SEPARATOR 關鍵字可指定任意分隔符(如管道符 |),便於後續程式解析:
SELECT `department`, `interval`, GROUP_CONCAT(`count` SEPARATOR '|') FROM `departmentweekdata` GROUP BY `department`, `interval`;
| department | interval | GROUP_CONCAT(count) |
|---|---|---|
| CAO | 1 | 1|1|1|0|1|2|2|0|0|1 |
| CAO | 2 | 0|0|1|1|2|0|2|0|0|0 |
| CAO | 3 | 1|1|0|0|0|1|0|0|1|0 |
| GBG1 | 1 | 0|0|0|0|0|0|0|0|0|0 |
| GBG1 | 2 | 0|0|0|0|0|0|0|0|0|0 |
| GBG1 | 3 | 0|0|0|0|0|0|0|0|0|0 |
加入 ORDER BY 子句可控制合併前的行順序,確保結果確定性:
SELECT `department`, `interval`,
GROUP_CONCAT(`count` ORDER BY `week` SEPARATOR '|')
FROM `departmentweekdata`
GROUP BY `department`, `interval`;
| department | interval | GROUP_CONCAT(count) |
|---|---|---|
| CAO | 1 | 0|1|0|0|1|2|1|1|2|1 |
| CAO | 2 | 0|0|1|1|2|0|0|2|0|0 |
| CAO | 3 | 1|0|0|0|0|1|0|0|1|1 |
| GBG1 | 1 | 0|0|0|0|0|0|0|0|0|0 |
| GBG1 | 2 | 0|0|0|0|0|0|0|0|0|0 |
| GBG1 | 3 | 0|0|0|0|0|0|0|0|0|0 |
加入 DISTINCT 關鍵字可自動過濾重複值:
SELECT `department`, `interval`,
GROUP_CONCAT(DISTINCT `count` ORDER BY `week` SEPARATOR '|')
FROM `departmentweekdata`
GROUP BY `department`, `interval`;
| department | interval | GROUP_CONCAT(count) |
|---|---|---|
| CAO | 1 | 0|2|1 |
| CAO | 2 | 1|2|0 |
| CAO | 3 | 1|0 |
| GBG1 | 1 | 0 |
| GBG1 | 2 | 0 |
| GBG1 | 3 | 0 |
MySQL 限制 GROUP_CONCAT 的最大輸出長度,預設為 1024 字節。可通過 group_concat_max_len 系統變數調整(最大值 4294967295):
-- 查看當前值 SHOW VARIABLES LIKE 'group_concat_max_len'; -- 臨時調大(當前會話) SET SESSION group_concat_max_len = 10000; -- 永久調大(需重啟生效,寫入 my.cnf) SET GLOBAL group_concat_max_len = 10000;
注意:過大的值會增加內存壓力,請根據實際業務需求合理設定。
group_concat_max_len,防止結果被截斷。ORDER BY 確保輸出順序穩定,利於下游處理。DISTINCT 減少輸出體積。|、#),避免解析歧義。