การรวมหลายแถวที่มีค่าเหมือนกันให้เป็นแถวเดียวด้วย GROUP_CONCAT
ใช้ GROUP_CONCAT() ร่วมกับ GROUP BY เพื่อรวมค่าจากหลายแถวเป็น String เดียว คั่นด้วย Separator ที่กำหนด
Syntax
SELECT group_column, GROUP_CONCAT(DISTINCT other_column SEPARATOR ',') FROM table_name GROUP BY group_column;
ตัวอย่าง: รวม ID ของชื่อที่ซ้ำกัน
สร้างตารางและเพิ่มข้อมูล (John 2 แถว, Chris 3 แถว):
mysql> CREATE TABLE DemoTable734 (Id INT, Name VARCHAR(100));
Query OK, 0 rows affected (0.73 sec)
mysql> INSERT INTO DemoTable734 VALUES
(101, 'John'), (102, 'John'), (103, 'Chris'), (104, 'Chris'), (104, 'Chris');
Query OK, 5 rows affected
ข้อมูลต้นฉบับ:
mysql> SELECT * FROM DemoTable734;
+------+-------+ | Id | Name | +------+-------+ | 101 | John | | 102 | John | | 103 | Chris | | 104 | Chris | | 104 | Chris | +------+-------+ 5 rows in set (0.00 sec)
รวมแถวตาม Name ใช้ GROUP_CONCAT:
mysql> SELECT Name, GROUP_CONCAT(DISTINCT Id SEPARATOR ',') FROM DemoTable734 GROUP BY Name;
+-------+-----------------------------------------+ | Name | GROUP_CONCAT(DISTINCT Id SEPARATOR ',') | +-------+-----------------------------------------+ | Chris | 103,104 | | John | 101,102 | +-------+-----------------------------------------+ 2 rows in set (0.04 sec)
ตัวเลือก GROUP_CONCAT
DISTINCT- ลบค่าซ้ำในกลุ่ม (เห็นตัวอย่าง: 104 ซ้ำ 2 ครั้ง แสดงแค่ 1 ครั้ง)SEPARATOR ','- ตัวคั่น (Default = ',')ORDER BYภายใน:GROUP_CONCAT(Id ORDER BY Id SEPARATOR ',')LIMIT(MySQL 8.0+):GROUP_CONCAT(Id ORDER BY Id LIMIT 5)
ข้อจำกัดและการตั้งค่า
- ความยาวสูงสุดควบคุมด้วย
group_concat_max_len(Default 1024 bytes) - เพิ่มได้:
SET SESSION group_concat_max_len = 1000000; - คืนค่า
NULLหากกลุ่มไม่มีแถว (ไม่ใช่ Empty String)
กรณีใช้งานจริง
- รายการ Tag/Category ของบทความ
- Email/Phone หลายค่าของลูกค้า
- สร้าง CSV Export จาก Database
- Denormalization สำหรับ Reporting
MySQL 8.0+: JSON_ARRAYAGG (Alternative)
SELECT Name, JSON_ARRAYAGG(DISTINCT Id) AS ids FROM DemoTable734 GROUP BY Name;
คืนค่า JSON Array แทน String สะดวกสำหรับ Application Parse