MySQL cho phép SELECT * ... GROUP BY cot_id (chế độ ONLY_FULL_GROUP_BY tắt) để lấy 1 hàng đại diện cho mỗi ID. Cách chuẩn SQL là dùng hàm tập hợp hoặc window function.
Cú pháp (MySQL truyền thống)
SELECT * FROM ten_bang GROUP BY cot_id;
Ví dụ minh họa
Tạo bảng DistinctIdDemo (Id có trùng):
CREATE TABLE DistinctIdDemo (Id INT, Name VARCHAR(20), Age INT);
INSERT INTO DistinctIdDemo VALUES
(1,'Mike',23), (2,'Sam',24), (1,'Carol',23), (1,'John',28), (3,'David',26), (2,'Larry',29);
Dữ liệu gốc: 6 hàng, Id 1 lặp 3 lần, Id 2 lặp 2 lần.
Truy vấn GROUP BY Id
SELECT * FROM DistinctIdDemo GROUP BY Id;
Kết quả: 3 hàng (mỗi Id 1 hàng, giá trị Name/Age lấy từ hàng đầu tiên gặp)
+------+-------+------+
| Id | Name | Age |
+------+-------+------+
| 1 | Mike | 23 |
| 2 | Sam | 24 |
| 3 | David | 26 |
+------+-------+------+
⚠️ Cảnh báo:
- Kết quả các cột không trong GROUP BY **không xác định** (tuỳ thứ tự lưu trữ).
- Bật
sql_mode=ONLY_FULL_GROUP_BY(mặc định từ MySQL 5.7) sẽ báo lỗi.
Cách chuẩn (ANSI SQL, MySQL 8.0+)
Dùng ROW_NUMBER() để chọn hàng cụ thể (ví dụ: hàng mới nhất, hàng có Age lớn nhất...):
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Age DESC) AS rn
FROM DistinctIdDemo
)
SELECT Id, Name, Age FROM ranked WHERE rn = 1;
Cách này kiểm soát rõ ràng hàng nào được chọn.