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

Cách gộp kết quả MySQL thành một dòng duy nhất bằng GROUP_CONCAT

Hàm GROUP_CONCAT() nối chuỗi các giá trị từ nhiều hàng thành một chuỗi duy nhất, phân tách bằng dấu phân cách tuỳ chọn. Rất hữu ích để xuất báo cáo gọn gàng hoặc truyền dữ liệu cho ứng dụng.

Cú pháp

SELECT GROUP_CONCAT(ten_cot [ORDER BY ten_cot [ASC|DESC]] [SEPARATOR 'ky_tu_phan_cach'])
FROM ten_bang
WHERE dieu_kien;

Ví dụ minh họa

Tạo bảng bài thi:

mysql> CREATE TABLE DemoTable1507 (
    -> Name VARCHAR(20),
    -> PaperSet INT
    -> );

Chèn dữ liệu:

mysql> INSERT INTO DemoTable1507 VALUES
    -> ('Chris', 111), ('David', 112), ('Mike', 111), ('Bob', 113);

Gộp tên học sinh có PaperSet = 111, sắp xếp giảm dần, phân cách bằng ':':

mysql> SELECT GROUP_CONCAT(Name ORDER BY Name DESC SEPARATOR ':')
    -> FROM DemoTable1507
    -> WHERE PaperSet = 111;

Kết quả:

+-----------------------------------------------------+
| GROUP_CONCAT(Name ORDER BY Name DESC SEPARATOR ':') |
+-----------------------------------------------------+
| Mike:Chris                                          |
+-----------------------------------------------------+

Tham số quan trọng

  • ORDER BY: sắp xếp trước khi nối (mặc định không đảm bảo thứ tự).
  • SEPARATOR: ký tự phân cách (mặc định là ','). Dùng '' để nối liền.
  • DISTINCT: loại bỏ trùng lặp: GROUP_CONCAT(DISTINCT Name ...).

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

Mặc định MySQL giới hạn kết quả GROUP_CONCAT ở **1024 bytes** (biến group_concat_max_len). Nếu dữ liệu lớn, hãy tăng trước khi chạy:

SET SESSION group_concat_max_len = 1000000; -- 1MB

Hoặc cấu hình vĩnh viễn trong my.cnf.

Ứng dụng thực tế

  • Xuất CSV một cột từ nhiều hàng.
  • Tạo danh sách ID cho mệnh đề IN (...) động.
  • Báo cáo tóm tắt: "Các sản phẩm bán chạy: A, B, C".