Gom nhóm giá trị trùng lặp thành danh sách phân cách bằng dấu phẩy
Sử dụng GROUP_CONCAT(DISTINCT ...) để liệt kê các giá trị duy nhất của cột trong mỗi nhóm, phân tách bằng dấu phẩy.
1. Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(40),
Score INT
);
mysql> INSERT INTO DemoTable (Name, Score) VALUES
('Chris', 56), ('Robert', 78), ('Chris', 56),
('Bob', 89), ('Chris', 56), ('Chris', 57);
2. Xem dữ liệu (có trùng lặp Name và Score)
mysql> SELECT * FROM DemoTable;
+----+--------+-------+ | Id | Name | Score | +----+--------+-------+ | 1 | Chris | 56 | | 2 | Robert | 78 | | 3 | Chris | 56 | | 4 | Bob | 89 | | 5 | Chris | 56 | | 6 | Chris | 57 | +----+--------+-------+
3. Truy vấn: Nhóm theo Name, liệt kê Score duy nhất
mysql> SELECT Name, GROUP_CONCAT(DISTINCT Score SEPARATOR ',')
FROM DemoTable
GROUP BY Name;
4. Kết quả
+--------+--------------------------------------------+ | Name | GROUP_CONCAT(DISTINCT Score SEPARATOR ',') | +--------+--------------------------------------------+ | Bob | 89 | | Chris | 56,57 | | Robert | 78 | +--------+--------------------------------------------+
Giải thích:
- Chris có 4 hàng: Score 56 (3 lần), 57 (1 lần) →
DISTINCTcho 56,57 - Mặc định sắp xếp theo thứ tự xuất hiện trong nhóm
- Muốn sắp xếp Score:
GROUP_CONCAT(DISTINCT Score ORDER BY Score SEPARATOR ',')
Ứng dụng thực tế: Tạo báo cáo tóm tắt, xuất CSV, hiển thị tags/categories cho mỗi bài viết, v.v.
Lưu ý: Độ dài mặc định 1024 ký tự. Tăng: SET SESSION group_concat_max_len = 10000;