รวมค่าจากหลายแถวเป็นสตริงเดียวด้วย GROUP_CONCAT()
GROUP_CONCAT() เป็น Aggregate Function รวมค่าจากหลายแถวในกลุ่มเดียวกันให้กลายเป็นสตริงคั่นด้วยตัวแบ่งที่กำหนด ใช้ร่วมกับ GROUP BY
ตัวอย่างสร้างตารางและข้อมูล
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(30),
Marks INT
);
INSERT INTO DemoTable (Name, Marks) VALUES
('John', 67), ('Carol', 69), ('Sam', 69),
('David', 78), ('Chris', 69), ('Bob', 67);
ข้อมูลในตาราง
+----+-------+-------+ | Id | Name | Marks | +----+-------+-------+ | 1 | John | 67 | | 2 | Carol | 69 | | 3 | Sam | 69 | | 4 | David | 78 | | 5 | Chris | 69 | | 6 | Bob | 67 | +----+-------+-------+
คำสั่งรวมชื่อตามคะแนน คั่นด้วยจุลภาค+ช่องว่าง เรียงชื่อ A-Z
SELECT Marks,
GROUP_CONCAT(Name ORDER BY Name ASC SEPARATOR ', ') AS Names
FROM DemoTable
GROUP BY Marks;
ผลลัพธ์
+-------+-----------------------------------------------------+ | Marks | Names | +-------+-----------------------------------------------------+ | 67 | Bob, John | | 69 | Carol, Chris, Sam | | 78 | David | +-------+-----------------------------------------------------+
ตัวเลือกสำคัญ:
ORDER BY Name ASCเรียงลำดับค่าภายในกลุ่มก่อนรวมSEPARATOR ', 'ตัวคั่น (ค่าเริ่มต้นคือ ',' ไม่มีช่องว่าง)DISTINCTกรองค่าซ้ำ:GROUP_CONCAT(DISTINCT Name ...)
⚠ ข้อจำกัด: ความยาวสูงสุดควบคุมโดย group_concat_max_len (Default 1024 bytes) หากข้อมูลเยอะ ตั้งค่า: SET SESSION group_concat_max_len = 1000000;
MySQL 8.0+ อีกทางเลือก: ใช้ JSON_ARRAYAGG() สร้าง JSON Array แทนสตริง (จัดการ Unicode/Escape ได้ดีกว่า)