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

Cách chọn giá trị distinct từ một cột MySQL (giữ cột khác)

Khi cần lấy giá trị duy nhất (distinct) của một cột nhưng vẫn muốn giữ thêm cột khác, không thể dùng SELECT DISTINCT col1, col2 vì nó distinct trên tổ hợp cả hai. Cách phổ biến là dùng GROUP BY với hàm tổng hợp như MAX() hoặc MIN() cho cột còn lại.

Ví dụ minh họa

Tạo bảng sinh viên (có thể trùng ID nhưng tên khác):

CREATE TABLE distinctFromOneColumn (
    StudentId INT,
    StudentName VARCHAR(100)
);

INSERT INTO distinctFromOneColumn VALUES (1001, 'John');
INSERT INTO distinctFromOneColumn VALUES (1002, 'Carol');
INSERT INTO distinctFromOneColumn VALUES (1001, 'Sam');
INSERT INTO distinctFromOneColumn VALUES (1001, 'David');
INSERT INTO distinctFromOneColumn VALUES (1002, 'Ramit');
INSERT INTO distinctFromOneColumn VALUES (1003, 'Bob');

Dữ liệu gốc (6 hàng, ID 1001 và 1002 trùng):

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1001      | John        |
| 1002      | Carol       |
| 1001      | Sam         |
| 1001      | David       |
| 1002      | Ramit       |
| 1003      | Bob         |
+-----------+-------------+

Lấy mỗi StudentId một lần, kèm tên (lấy tên lớn nhất alphabet - MAX):

SELECT StudentId, MAX(StudentName) AS StudentName
FROM distinctFromOneColumn
GROUP BY StudentId;

Kết quả (3 hàng):

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1001      | Sam         |
| 1002      | Ramit       |
| 1003      | Bob         |
+-----------+-------------+

Lưu ý:

  • MAX(StudentName) chọn tên theo thứ tự alphabet (Z > A). Dùng MIN() nếu muốn tên nhỏ nhất.
  • Nếu cần logic chọn tên phức tạp hơn (ví dụ: tên đầu tiên nhập, tên mới nhất), hãy dùng window function ROW_NUMBER() OVER (PARTITION BY StudentId ORDER BY ...) (MySQL 8.0+).
  • Cách này tuân thủ SQL standard: mọi cột trong SELECT phải nằm trong GROUP BY hoặc được bọc trong hàm tổng hợp.