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

รวมแถว (Merge Rows) ใน MySQL ด้วย GROUP_CONCAT()

การรวมหลายแถวที่มีค่าเหมือนกันให้เป็นแถวเดียวด้วย 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