ภาพรวม
ใช้ GROUP_CONCAT() รวมค่าจากหลายแถว (หลัง GROUP BY) ให้เป็นสตริงเดียว คั่นด้วยจุลภาค (หรือตัวคั่นที่กำหนด)
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล (Id ซ้ำได้)
CREATE TABLE DemoTable (
Id INT,
Name VARCHAR(40)
);
INSERT INTO DemoTable VALUES (100, 'Chris Brown');
INSERT INTO DemoTable VALUES (101, 'Adam Smith');
INSERT INTO DemoTable VALUES (101, 'John Doe');
INSERT INTO DemoTable VALUES (100, 'David Miller');
INSERT INTO DemoTable VALUES (101, 'Carol Taylor');
INSERT INTO DemoTable VALUES (103, 'Bob Taylor');
2. ข้อมูลก่อนรวม
SELECT * FROM DemoTable;
+------+--------------+
| Id | Name |
+------+--------------+
| 100 | Chris Brown |
| 101 | Adam Smith |
| 101 | John Doe |
| 100 | David Miller |
| 101 | Carol Taylor |
| 103 | Bob Taylor |
+------+--------------+
3. รวมชื่อตาม Id (GROUP BY Id)
SELECT Id, GROUP_CONCAT(Name)
FROM DemoTable
GROUP BY Id;
4. ผลลัพธ์
+------+----------------------------------+
| Id | GROUP_CONCAT(Name) |
+------+----------------------------------+
| 100 | Chris Brown,David Miller |
| 101 | Adam Smith,John Doe,Carol Taylor |
| 103 | Bob Taylor |
+------+----------------------------------+
ตัวเลือกสำคัญของ GROUP_CONCAT
| ตัวเลือก | ไวยากรณ์ | คำอธิบาย |
|---|---|---|
| DISTINCT | GROUP_CONCAT(DISTINCT col) | กำจัดค่าซ้ำในกลุ่ม |
| ORDER BY | GROUP_CONCAT(col ORDER BY col) | เรียงลำดับก่อนรวม |
| SEPARATOR | GROUP_CONCAT(col SEPARATOR ' | ') | เปลี่ยนตัวคั่น (Default = ',') |
| รวมทั้งหมด | GROUP_CONCAT(DISTINCT col ORDER BY col SEPARATOR ';') | ใช้ร่วมกันได้ |
ตัวอย่างใช้ตัวเลือกครบ
SELECT Id,
GROUP_CONCAT(DISTINCT Name ORDER BY Name SEPARATOR ' | ') AS Names
FROM DemoTable
GROUP BY Id;
ข้อจำกัดและการตั้งค่า
- group_concat_max_len: ความยาวสูงสุด (Default 1024 bytes)
- เพิ่มได้:
SET SESSION group_concat_max_len = 1000000; - คืน
NULLหากกลุ่มไม่มีแถว (ไม่ใช่ Empty String)
กรณีใช้งานจริง
- สร้าง Tag List, Category List ต่อ Entity
- Export ข้อมูลเป็น CSV Format
- รวม Email/Phone สำหรับส่งอีเมล/สמס 일괄
- แสดงรายการสินค้าใน Order เดียว
MySQL 8.0+: JSON_ARRAYAGG() (Alternative)
SELECT Id, JSON_ARRAYAGG(Name) AS Names
FROM DemoTable
GROUP BY Id;
-- ผลลัพธ์: JSON Array ["Chris Brown", "David Miller"] - สะดวกสำหรับ API
สรุป
GROUP_CONCAT() รวมหลายแถวเป็นสตริงคั่นจุลภาค ใช้ร่วม GROUP BY ตัวเลือก DISTINCT, ORDER BY, SEPARATOR ควบคุมรูปแบบผลลัพธ์