GROUP_CONCAT: รวมค่าจากหลายแถวในกลุ่มเดียวเป็นสตริง CSV
ใช้ GROUP_CONCAT() ร่วมกับ GROUP BY เพื่อรวม FirstName ของ Id เดียวกันเป็นสตริง คั่นด้วย Comma
สร้างตารางและข้อมูล (Id ซ้ำ)
mysql> CREATE TABLE DemoTable (Id INT, FirstName VARCHAR(20));
Query OK, 0 rows affected (0.78 sec)
mysql> INSERT INTO DemoTable VALUES
-> (101, 'John'), (102, 'Bob'), (101, 'David'), (101, 'Adam'), (102, 'Chris');
Query OK, 5 rows affected
ข้อมูลก่อนจัดกลุ่ม
+------+-----------+ | Id | FirstName | +------+-----------+ | 101 | John | | 102 | Bob | | 101 | David | | 101 | Adam | | 102 | Chris | +------+-----------+
คำสั่ง: GROUP BY Id, รวม FirstName ด้วย Comma, เรียงตามจำนวนน้อยไปมาก
mysql> SELECT Id, GROUP_CONCAT(FirstName SEPARATOR ',')
-> FROM DemoTable
-> GROUP BY Id
-> ORDER BY COUNT(Id);
ผลลัพธ์
+------+---------------------------------------+ | Id | group_concat(FirstName separator ',') | +------+---------------------------------------+ | 102 | Bob,Chris | | 101 | John,David,Adam | +------+---------------------------------------+
คำอธิบาย
GROUP BY Id- จัดกลุ่มตาม IdGROUP_CONCAT(FirstName SEPARATOR ',')- รวมชื่อในกลุ่มคั่น CommaORDER BY COUNT(Id)- เรียงกลุ่มตามจำนวนสมาชิกน้อยไปมาก (102 มี 2 คน, 101 มี 3 คน)
ตัวเลือก GROUP_CONCAT ที่มีประโยชน์
-- เรียงลำดับในกลุ่ม GROUP_CONCAT(FirstName ORDER BY FirstName SEPARATOR ',') -- ลบค่าซ้ำ GROUP_CONCAT(DISTINCT FirstName SEPARATOR ',') -- จำกัดจำนวน (MySQL 8.0+) GROUP_CONCAT(FirstName ORDER BY FirstName SEPARATOR ',' LIMIT 5)
⚠️ ข้อจำกัด group_concat_max_len
Default = 1024 bytes หากข้อมูลเยอะจะถูกตัด
SET SESSION group_concat_max_len = 1000000;
ประยุกต์: สร้าง JSON Array (MySQL 5.7+)
SELECT Id, CONCAT('[', GROUP_CONCAT(JSON_QUOTE(FirstName)), ']') AS names_json
FROM DemoTable
GROUP BY Id;
ผลลัพธ์ JSON
+------+-----------------------------+ | Id | names_json | +------+-----------------------------+ | 101 | ["John","David","Adam"] | | 102 | ["Bob","Chris"] | +------+-----------------------------+