Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

รวมแถวเป็นรายการคั่นจุลภาค (Comma-delimited) ด้วย GROUP_CONCAT() ใน MySQL

ภาพรวม

ใช้ 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

ตัวเลือกไวยากรณ์คำอธิบาย
DISTINCTGROUP_CONCAT(DISTINCT col)กำจัดค่าซ้ำในกลุ่ม
ORDER BYGROUP_CONCAT(col ORDER BY col)เรียงลำดับก่อนรวม
SEPARATORGROUP_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 ควบคุมรูปแบบผลลัพธ์