Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Gộp nhiều dòng thành danh sách phân cách dấu phẩy trong MySQL?

Giải pháp: GROUP_CONCAT()

Hàm tổng hợp GROUP_CONCAT() nối các giá trị trong nhóm thành chuỗi phân cách.

Ví dụ minh họa

Tạo bảng điểm thi

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

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

Dữ liệu gốc

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

Truy vấn GROUP_CONCAT

mysql> SELECT 
    ->     Marks, 
    ->     GROUP_CONCAT(Name ORDER BY Name ASC SEPARATOR ', ') AS Students
    -> FROM DemoTable 
    -> GROUP BY Marks;

Kết quả

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

Cú pháp đầy đủ

GROUP_CONCAT(
    [DISTINCT] expr 
    [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [, ...]]
    [SEPARATOR str_val]
)

Các tùy chọn

⚠️ Giới hạn độ dài

Mặc định group_concat_max_len = 1024 bytes. Kết quả bị cắt nếu quá dài.

Tăng giới hạn

-- Session
SET SESSION group_concat_max_len = 1000000;

-- Global (cần restart)
SET GLOBAL group_concat_max_len = 1000000;

-- Hoặc trong query (MySQL 8.0+)
SELECT GROUP_CONCAT(Name SEPARATOR ',') FROM DemoTable 
GROUP BY Marks 
HAVING CHAR_LENGTH(GROUP_CONCAT(Name SEPARATOR ',')) < 1000000;

Ứng dụng thực tế

  • Danh sách tag: GROUP_CONCAT(tag_name SEPARATOR ', ')
  • Export CSV từ SQL
  • Tạo danh sách ID cho IN(): GROUP_CONCAT(id)
  • Audit log: gộp hành động theo user/ngày

Lưu ý

  • NULL values bị bỏ qua (không cộng vào kết quả)
  • Kết quả luôn là STRING (TEXT/BLOB)
  • Không dùng trong WHERE/HAVING trực tiếp (cần subquery)
Tùy chọnMặc địnhVí dụ
DISTINCTKhôngLoại bỏ trùng lặp
ORDER BYKhông sắp xếpORDER BY Name ASC
SEPARATOR','SEPARATOR '; ', SEPARATOR ' | '