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

Nối nhiều hàng và cột thành một hàng đơn trong MySQL với GROUP_CONCAT

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 để CONCAT không bị NULL toàn bộ.
  • GROUP_CONCAT(expr [SEPARATOR ',']): Gom các giá trị expr củ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ọnCú phápMô tả
Phân cách tùy chỉnhGROUP_CONCAT(...) SEPARATOR '; 'Dùng chấm phẩy, xuống dòng, v.v.
Sắp xếp trong nhómGROUP_CONCAT(expr ORDER BY ClientId DESC)Sắp xếp trước khi nối
Loại trùng lặpGROUP_CONCAT(DISTINCT expr)Chỉ giữ giá trị duy nhất
Giới hạn độ dàiSET 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.