常見需求:一位老師對應多個班級,查詢時希望輸出「教師 | 班級列表」格式,而非多行重複教師名。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);
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;
group_concat_max_len 會被截斷,生產環境務必根據業務最大長度調整。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 函數更能無縫對接現代前端。