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

จัดกลุ่มแถว MySQL เป็น Array/CSV ด้วย GROUP_CONCAT และ ORDER BY

GROUP_CONCAT: รวมค่าจากหลายแถวในกลุ่มเดียวเป็นสตริง CSV

ใช้ GROUP_CONCAT() ร่วมกับ GROUP BY เพื่อรวม FirstName ของ Id เดียวกันเป็นสตริง คั่นด้วย Comma

สร้างตารางและข้อมูล (Id ซ้ำ)

mysql> CREATE TABLE DemoTable (Id INT, FirstName VARCHAR(20));
Query OK, 0 rows affected (0.78 sec)

mysql> INSERT INTO DemoTable VALUES
    -> (101, 'John'), (102, 'Bob'), (101, 'David'), (101, 'Adam'), (102, 'Chris');
Query OK, 5 rows affected

ข้อมูลก่อนจัดกลุ่ม

+------+-----------+
| Id   | FirstName |
+------+-----------+
|  101 | John      |
|  102 | Bob       |
|  101 | David     |
|  101 | Adam      |
|  102 | Chris     |
+------+-----------+

คำสั่ง: GROUP BY Id, รวม FirstName ด้วย Comma, เรียงตามจำนวนน้อยไปมาก

mysql> SELECT Id, GROUP_CONCAT(FirstName SEPARATOR ',')
    -> FROM DemoTable
    -> GROUP BY Id
    -> ORDER BY COUNT(Id);

ผลลัพธ์

+------+---------------------------------------+
| Id   | group_concat(FirstName separator ',') |
+------+---------------------------------------+
|  102 | Bob,Chris                             |
|  101 | John,David,Adam                       |
+------+---------------------------------------+

คำอธิบาย

  • GROUP BY Id - จัดกลุ่มตาม Id
  • GROUP_CONCAT(FirstName SEPARATOR ',') - รวมชื่อในกลุ่มคั่น Comma
  • ORDER BY COUNT(Id) - เรียงกลุ่มตามจำนวนสมาชิกน้อยไปมาก (102 มี 2 คน, 101 มี 3 คน)

ตัวเลือก GROUP_CONCAT ที่มีประโยชน์

-- เรียงลำดับในกลุ่ม
GROUP_CONCAT(FirstName ORDER BY FirstName SEPARATOR ',')

-- ลบค่าซ้ำ
GROUP_CONCAT(DISTINCT FirstName SEPARATOR ',')

-- จำกัดจำนวน (MySQL 8.0+)
GROUP_CONCAT(FirstName ORDER BY FirstName SEPARATOR ',' LIMIT 5)

⚠️ ข้อจำกัด group_concat_max_len

Default = 1024 bytes หากข้อมูลเยอะจะถูกตัด

SET SESSION group_concat_max_len = 1000000;

ประยุกต์: สร้าง JSON Array (MySQL 5.7+)

SELECT Id, CONCAT('[', GROUP_CONCAT(JSON_QUOTE(FirstName)), ']') AS names_json
FROM DemoTable
GROUP BY Id;

ผลลัพธ์ JSON

+------+-----------------------------+
| Id   | names_json                  |
+------+-----------------------------+
|  101 | ["John","David","Adam"]     |
|  102 | ["Bob","Chris"]             |
+------+-----------------------------+