Hàm GROUP_CONCAT() trong MySQL gom nhiều hàng thành một chuỗi, kết hợp với CONCAT() để nối nhiều cột trong mỗi hàng. Kết quả: một hàng đơn chứa toàn bộ dữ liệu bảng — hữu ích cho export, log, hoặc hiển thị tóm tắt.
Ví dụ minh họa
Tạo bảng khách hàng:
mysql> CREATE TABLE DemoTable1463 (
ClientId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName VARCHAR(20),
ClientAge INT
);
Chèn dữ liệu (có NULL):
mysql> INSERT INTO DemoTable1463 (ClientName, ClientAge) VALUES ('Adam Smith', 34);
mysql> INSERT INTO DemoTable1463 (ClientName, ClientAge) VALUES ('John Doe', 29);
mysql> INSERT INTO DemoTable1463 (ClientName, ClientAge) VALUES ('David Miller', NULL);
mysql> INSERT INTO DemoTable1463 (ClientName, ClientAge) VALUES ('John Smith', 32);
Dữ liệu:
mysql> SELECT * FROM DemoTable1463;
+----------+--------------+-----------+ | ClientId | ClientName | ClientAge | +----------+--------------+-----------+ | 1 | Adam Smith | 34 | | 2 | John Doe | 29 | | 3 | David Miller | NULL | | 4 | John Smith | 32 | +----------+--------------+-----------+
Nối Id:Name:Age thành một chuỗi, các hàng cách nhau bởi dấu phẩy
mysql> SELECT GROUP_CONCAT(CONCAT(ClientId, ':', ClientName, ':', IFNULL(ClientAge, '')))
FROM DemoTable1463;
Kết quả:
+------------------------------------------------------------------------+ | GROUP_CONCAT(CONCAT(ClientId, ':', ClientName, ':', IFNULL(ClientAge, ''))) | +------------------------------------------------------------------------+ | 1:Adam Smith:34,2:John Doe:29,3:David Miller:,4:John Smith:32 | +------------------------------------------------------------------------+
Giải thích các hàm
CONCAT(a, b, c...): Nối chuỗi — trả về NULL nếu bất kỳ tham số nào NULL.IFNULL(ClientAge, ''): Thay NULL bằng chuỗi rỗng đểCONCATkhông bị NULL toàn bộ.GROUP_CONCAT(expr [SEPARATOR ',']): Gom các giá trịexprcủa nhóm thành chuỗi, phân cách bằng dấu phẩy (mặc định).
Tùy chỉnh GROUP_CONCAT
| Tùy chọn | Cú pháp | Mô tả |
|---|---|---|
| Phân cách tùy chỉnh | GROUP_CONCAT(...) SEPARATOR '; ' | Dùng chấm phẩy, xuống dòng, v.v. |
| Sắp xếp trong nhóm | GROUP_CONCAT(expr ORDER BY ClientId DESC) | Sắp xếp trước khi nối |
| Loại trùng lặp | GROUP_CONCAT(DISTINCT expr) | Chỉ giữ giá trị duy nhất |
| Giới hạn độ dài | SET SESSION group_concat_max_len = 1000000; | Mặc định 1024 bytes — tăng nếu dữ liệu lớn |
Ứng dụng thực tế
- Xuất CSV một dòng cho báo cáo.
- Tạo danh sách ID cho truy vấn
IN (...)động. - Log thay đổi: gom lịch sử thành một trường.
- Denormalization cho đọc nhanh (materialized view).
Lưu ý: GROUP_CONCAT giới hạn độ dài bởi biến hệ thống group_concat_max_len (mặc định 1024). Dữ liệu lớn sẽ bị cắt ngấn — hãy tăng giá trị này trước khi chạy.