Hàm GROUP_CONCAT() gom các giá trị từ nhiều hàng trong cùng một nhóm thành một chuỗi, phân tách bằng ký tự tuỳ chọn. Kết hợp GROUP BY để tạo "mảng" cho mỗi giá trị khóa.
Cú pháp
SELECT cot_khoa,
GROUP_CONCAT(cot_gia_tri [ORDER BY cot_sap_xep] [SEPARATOR 'ky_tu']) AS ten_alias
FROM ten_bang
GROUP BY cot_khoa
ORDER BY COUNT(*) -- tuỳ chọn: sắp xếp nhóm theo số lượng
Ví dụ minh họa
Tạo bảng:
mysql> CREATE TABLE DemoTable (Id INT, FirstName VARCHAR(20));
mysql> INSERT INTO DemoTable VALUES
-> (101,'John'), (102,'Bob'), (101,'David'), (101,'Adam'), (102,'Chris');
Gom tên theo Id, phân cách bằng dấu phẩy, sắp xếp nhóm theo số lượng tăng dần:
mysql> SELECT Id, GROUP_CONCAT(FirstName SEPARATOR ',')
-> FROM DemoTable
-> GROUP BY Id
-> ORDER BY COUNT(Id);
Kết quả:
+------+---------------------------------------+ | Id | GROUP_CONCAT(FirstName SEPARATOR ',') | +------+---------------------------------------+ | 102 | Bob,Chris | | 101 | John,David,Adam | +------+---------------------------------------+
Tùy chọn quan trọng
ORDER BYbên trong:GROUP_CONCAT(FirstName ORDER BY FirstName)– sắp xếp giá trị trong chuỗi.DISTINCT:GROUP_CONCAT(DISTINCT FirstName)– loại trùng lặp.SEPARATOR: mặc định ','. Dùng '' để nối liền, hoặc ';', '|', v.v.
⚠️ Giới hạn độ dài
Mặc định group_concat_max_len = 1024 bytes. Tăng nếu cần:
SET SESSION group_concat_max_len = 1000000;
Ứng dụng
- Xuất báo cáo: "Khách hàng A mua: SP1, SP2, SP3".
- Tạo danh sách ID cho
IN (...)động. - Chuyển dữ liệu quan hệ sang dạng JSON/CSV cho frontend.