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

วิธีรวมหลายแถวเป็นรายการคั่นจุลภาคด้วย GROUP_CONCAT ใน MySQL

รวมค่าจากหลายแถวเป็นสตริงเดียวด้วย GROUP_CONCAT()

GROUP_CONCAT() เป็น Aggregate Function รวมค่าจากหลายแถวในกลุ่มเดียวกันให้กลายเป็นสตริงคั่นด้วยตัวแบ่งที่กำหนด ใช้ร่วมกับ GROUP BY

ตัวอย่างสร้างตารางและข้อมูล

CREATE TABLE DemoTable (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name VARCHAR(30),
    Marks INT
);

INSERT INTO DemoTable (Name, Marks) VALUES
('John', 67), ('Carol', 69), ('Sam', 69),
('David', 78), ('Chris', 69), ('Bob', 67);

ข้อมูลในตาราง

+----+-------+-------+
| Id | Name  | Marks |
+----+-------+-------+
| 1  | John  | 67    |
| 2  | Carol | 69    |
| 3  | Sam   | 69    |
| 4  | David | 78    |
| 5  | Chris | 69    |
| 6  | Bob   | 67    |
+----+-------+-------+

คำสั่งรวมชื่อตามคะแนน คั่นด้วยจุลภาค+ช่องว่าง เรียงชื่อ A-Z

SELECT Marks, 
    GROUP_CONCAT(Name ORDER BY Name ASC SEPARATOR ', ') AS Names
FROM DemoTable 
GROUP BY Marks;

ผลลัพธ์

+-------+-----------------------------------------------------+
| Marks | Names                                               |
+-------+-----------------------------------------------------+
| 67    | Bob, John                                           |
| 69    | Carol, Chris, Sam                                   |
| 78    | David                                               |
+-------+-----------------------------------------------------+

ตัวเลือกสำคัญ:

  • ORDER BY Name ASC เรียงลำดับค่าภายในกลุ่มก่อนรวม
  • SEPARATOR ', ' ตัวคั่น (ค่าเริ่มต้นคือ ',' ไม่มีช่องว่าง)
  • DISTINCT กรองค่าซ้ำ: GROUP_CONCAT(DISTINCT Name ...)

⚠ ข้อจำกัด: ความยาวสูงสุดควบคุมโดย group_concat_max_len (Default 1024 bytes) หากข้อมูลเยอะ ตั้งค่า: SET SESSION group_concat_max_len = 1000000;

MySQL 8.0+ อีกทางเลือก: ใช้ JSON_ARRAYAGG() สร้าง JSON Array แทนสตริง (จัดการ Unicode/Escape ได้ดีกว่า)