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

Hiển thị giá trị trùng lặp riêng biệt với GROUP_CONCAT DISTINCT trong MySQL

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) → DISTINCT cho 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;