ใช้ GROUP_CONCAT() ร่วมกับ CONCAT() เพื่อรวมค่าจากหลายแถวให้กลายเป็น 1 สตริง คั่นด้วยคอมม่า (หรือ Separator อื่นๆ)
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable1807 (
Id INT
);
Query OK, 0 rows affected (0.00 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO DemoTable1807 VALUES(101); mysql> INSERT INTO DemoTable1807 VALUES(102); mysql> INSERT INTO DemoTable1807 VALUES(103);
3. แสดงข้อมูลเดิม
mysql> SELECT * FROM DemoTable1807; +------+ | Id | +------+ | 101 | | 102 | | 103 | +------+
4. Query: รวมค่า Id ใส่ [] คั่นคอมม่า
mysql> SELECT GROUP_CONCAT(CONCAT('[', Id, ']')) FROM DemoTable1807;
5. ผลลัพธ์
+----------------------------------+
| GROUP_CONCAT(CONCAT('[', Id, ']')) |
+----------------------------------+
| [101],[102],[103] |
+----------------------------------+
ตัวเลือก GROUP_CONCAT
GROUP_CONCAT(
[DISTINCT] expr
[ORDER BY expr [ASC|DESC]]
[SEPARATOR 'str']
)
| ตัวเลือก | คำอธิบาย | ตัวอย่าง |
|---|---|---|
DISTINCT | กรองค่าซ้ำ | GROUP_CONCAT(DISTINCT Id) |
ORDER BY | เรียงลำดับก่อนรวม | GROUP_CONCAT(Id ORDER BY Id DESC) |
SEPARATOR | ตัวคั่น (Default = ',') | GROUP_CONCAT(Id SEPARATOR ';') |
⚠️ ข้อจำกัด: group_concat_max_len
- Default: 1024 ตัวอักษร (จะถูกตัดทอนถ้ายาวเกิน)
- แก้ไข:
SET SESSION group_concat_max_len = 1000000;(หรือค่าที่ต้องการ) - ตั้งค่าประจำ: เพิ่มใน
my.cnf/my.ini:group_concat_max_len = 1000000
ตัวอย่างเพิ่มเติม
-- รวมชื่อ คั่น ; เรียง A-Z ไม่ซ้ำ
SELECT GROUP_CONCAT(DISTINCT Name ORDER BY Name SEPARATOR '; ') FROM users;
-- รวม JSON Object
SELECT CONCAT('[', GROUP_CONCAT(CONCAT('{"id":', Id, ',"name":"', Name, '"}')), ']') AS json_array FROM users;
สรุป
GROUP_CONCAT(CONCAT('[', Id, ']')) รวมค่าหลายแถวเป็น 1 สตริง คั่นคอมม่า ใส่ Format ได้ด้วย CONCAT ภายใน จำกัดความยาว 1024 ตัวอักษร Default ต้อง SET SESSION group_concat_max_len หากข้อมูลเยอะ