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

MySQL รวมค่าคอลัมน์ทั้งหมดเป็น 1 แถว คั่นคอมม่า ด้วย GROUP_CONCAT

ใช้ GROUP_CONCAT() ร่วมกับ CONCAT() เพื่อรวมค่าจากหลายแถวให้กลายเป็น 1 สตริง คั่นด้วยคอมม่า (หรือ Separator อื่นๆ)

ตัวอย่างการใช้งาน

1. สร้างตาราง

mysql> CREATE TABLE DemoTable1807 (
    Id INT
);
Query OK, 0 rows affected (0.00 sec)

2. เพิ่มข้อมูล

mysql> INSERT INTO DemoTable1807 VALUES(101);
mysql> INSERT INTO DemoTable1807 VALUES(102);
mysql> INSERT INTO DemoTable1807 VALUES(103);

3. แสดงข้อมูลเดิม

mysql> SELECT * FROM DemoTable1807;
+------+
| Id   |
+------+
|  101 |
|  102 |
|  103 |
+------+

4. Query: รวมค่า Id ใส่ [] คั่นคอมม่า

mysql> SELECT GROUP_CONCAT(CONCAT('[', Id, ']')) FROM DemoTable1807;

5. ผลลัพธ์

+----------------------------------+
| GROUP_CONCAT(CONCAT('[', Id, ']')) |
+----------------------------------+
| [101],[102],[103]                |
+----------------------------------+

ตัวเลือก GROUP_CONCAT

GROUP_CONCAT(
    [DISTINCT] expr
    [ORDER BY expr [ASC|DESC]]
    [SEPARATOR 'str']
)
ตัวเลือกคำอธิบายตัวอย่าง
DISTINCTกรองค่าซ้ำGROUP_CONCAT(DISTINCT Id)
ORDER BYเรียงลำดับก่อนรวมGROUP_CONCAT(Id ORDER BY Id DESC)
SEPARATORตัวคั่น (Default = ',')GROUP_CONCAT(Id SEPARATOR ';')

⚠️ ข้อจำกัด: group_concat_max_len

  • Default: 1024 ตัวอักษร (จะถูกตัดทอนถ้ายาวเกิน)
  • แก้ไข: SET SESSION group_concat_max_len = 1000000; (หรือค่าที่ต้องการ)
  • ตั้งค่าประจำ: เพิ่มใน my.cnf / my.ini: group_concat_max_len = 1000000

ตัวอย่างเพิ่มเติม

-- รวมชื่อ คั่น ; เรียง A-Z ไม่ซ้ำ
SELECT GROUP_CONCAT(DISTINCT Name ORDER BY Name SEPARATOR '; ') FROM users;

-- รวม JSON Object
SELECT CONCAT('[', GROUP_CONCAT(CONCAT('{"id":', Id, ',"name":"', Name, '"}')), ']') AS json_array FROM users;

สรุป

GROUP_CONCAT(CONCAT('[', Id, ']')) รวมค่าหลายแถวเป็น 1 สตริง คั่นคอมม่า ใส่ Format ได้ด้วย CONCAT ภายใน จำกัดความยาว 1024 ตัวอักษร Default ต้อง SET SESSION group_concat_max_len หากข้อมูลเยอะ