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ùngMIN()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
SELECTphải nằm trongGROUP BYhoặc được bọc trong hàm tổng hợp.