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

GROUP_CONCAT DISTINCT theo Id trong MySQL


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, Name loạ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;.