Vấn đề
Gom tên (Name) theo Id, nhưng mỗi Id có thể trùng lặp Name. Cần gom distinct Name per Id.
Giải pháp: Subquery DISTINCT rồi GROUP_CONCAT
SELECT GROUP_CONCAT(Name) FROM (SELECT DISTINCT Id, Name FROM DemoTable) tbl;
Ví dụ minh họa
Tạo bảng và chèn dữ liệu (có trùng)
mysql> CREATE TABLE DemoTable (Id INT, Name VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES (100, 'Chris'), (200, 'Robert'), (100, 'Chris'), (300, 'David'), (400, 'Mike'), (400, 'Mike');
Truy vấn
mysql> SELECT GROUP_CONCAT(Name) FROM (SELECT DISTINCT Id, Name FROM DemoTable) tbl;
Kết quả
+-------------------------+ | GROUP_CONCAT(Name) | +-------------------------+ | Chris,Robert,David,Mike | +-------------------------+
Giải thích
- Subquery
SELECT DISTINCT Id, Nameloại bỏ dòng trùng hoàn toàn (cặp Id+Name). GROUP_CONCAT(Name)gom Name của các dòng distinct còn lại.- Kết quả là 1 dòng 1 cột (không GROUP BY Id).
Nếu cần GROUP BY Id (mỗi Id 1 dòng)
SELECT Id, GROUP_CONCAT(DISTINCT Name) FROM DemoTable GROUP BY Id;
GROUP_CONCAT(DISTINCT Name) (MySQL hỗ trợ) loại trùng Name trong từng group Id.
Kết quả
+------+-------------------------+ | Id | GROUP_CONCAT(DISTINCT Name) | +------+-------------------------+ | 100 | Chris | | 200 | Robert | | 300 | David | | 400 | Mike | +------+-------------------------+
Lưu ý
GROUP_CONCAT(DISTINCT ...)chỉ khả dụng trong MySQL, không chuẩn SQL.- Mặc định max 1024 bytes. Tăng:
SET SESSION group_concat_max_len = 1000000;.