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

MySQL 使用 GROUP_CONCAT 將同一 ID 多行數據合併為單行

     編輯:MySQL 綜合教學

MySQL 多行合併為單行:GROUP_CONCAT 實戰指南

常見需求:一位老師對應多個班級,查詢時希望輸出「教師 | 班級列表」格式,而非多行重複教師名。MySQL 內建聚合函數 GROUP_CONCAT 可輕鬆實現。

表結構與樣本數據

CREATE TABLE c_classuser_tab (
    Id INT PRIMARY KEY AUTO_INCREMENT,
    Classid INT,
    Username VARCHAR(100),
    Remark1 VARCHAR(100),  -- 存班級名
    userID INT,
    userType INT,
    KEY idx_classuser_complex (Classid, userID)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- 假設 userID=100 的老師代課 1班、2班
INSERT INTO c_classuser_tab (Username, Remark1, userID, userType)
VALUES ('張老師', '1班', 100, 1), ('張老師', '2班', 100, 1);

核心 SQL

SELECT 
    Username,
    GROUP_CONCAT(Remark1 SEPARATOR ',') AS classes
FROM c_classuser_tab
WHERE userID = 100 AND userType = 1
GROUP BY Username;

結果:

+----------+-----------+
| Username | classes   |
+----------+-----------+
| 張老師   | 1班,2班  |
+----------+-----------+

關鍵參數詳解

  • SEPARATOR ',':自定義分隔符,預設為逗號 ,。
  • DISTINCT:去重,如 GROUP_CONCAT(DISTINCT Remark1)。
  • ORDER BY:組內排序,GROUP_CONCAT(Remark1 ORDER BY Classid SEPARATOR ',')。
  • group_concat_max_len:系統變量,控制最大回傳長度(預設 1024 字節),超大數據需調大:
    SET SESSION group_concat_max_len = 1000000;

進階:按其他欄位分組合併

若需「班級 | 教師列表」,只需調整 GROUP BY 與選取欄位:

SELECT 
    Classid,
    GROUP_CONCAT(Username ORDER BY Username SEPARATOR '、') AS teachers
FROM c_classuser_tab
GROUP BY Classid;

注意事項

  1. NULL 值會被忽略,不會出現在結果中。
  2. 超過 group_concat_max_len 會被截斷,生產環境務必根據業務最大長度調整。
  3. 配合 JSON_ARRAYAGG (MySQL 5.7+) 可直接生成 JSON 陣列,前端解析更方便:
    SELECT Username, JSON_ARRAYAGG(Remark1) AS classes FROM ... GROUP BY Username;

總結

GROUP_CONCAT 是 MySQL 處理「一對多扁平化」的利器,配合 SEPARATOR、ORDER BY、DISTINCT 可覆蓋 90% 以上合併場景,配合 JSON 函數更能無縫對接現代前端。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved