首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL GROUP_CONCAT 函數完整指南與實戰範例

     編輯:MySQL 綜合教學

GROUP_CONCAT 函數概述

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`;

查詢結果示例

departmentintervalGROUP_CONCAT(count)
CAO11,1,1,0,1,2,2,0,0,1
CAO20,0,1,1,2,0,2,0,0,0
CAO31,1,0,0,0,1,0,0,1,0
GBG110,0,0,0,0,0,0,0,0,0
GBG120,0,0,0,0,0,0,0,0,0
GBG130,0,0,0,0,0,0,0,0,0

自定義分隔符

使用 SEPARATOR 關鍵字可指定任意分隔符(如管道符 |),便於後續程式解析:

SELECT `department`, `interval`, GROUP_CONCAT(`count` SEPARATOR '|')
FROM `departmentweekdata`
GROUP BY `department`, `interval`;

結果示例

departmentintervalGROUP_CONCAT(count)
CAO11|1|1|0|1|2|2|0|0|1
CAO20|0|1|1|2|0|2|0|0|0
CAO31|1|0|0|0|1|0|0|1|0
GBG110|0|0|0|0|0|0|0|0|0
GBG120|0|0|0|0|0|0|0|0|0
GBG130|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`;

排序後結果

departmentintervalGROUP_CONCAT(count)
CAO10|1|0|0|1|2|1|1|2|1
CAO20|0|1|1|2|0|0|2|0|0
CAO31|0|0|0|0|1|0|0|1|1
GBG110|0|0|0|0|0|0|0|0|0
GBG120|0|0|0|0|0|0|0|0|0
GBG130|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`;

去重後結果

departmentintervalGROUP_CONCAT(count)
CAO10|2|1
CAO21|2|0
CAO31|0
GBG110
GBG120
GBG130

控制最大輸出長度

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 減少輸出體積。
  • 分隔符建議使用不會出現在數據中的字元(如 |、#),避免解析歧義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved