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

SELECT * với ID duy nhất (DISTINCT) trong MySQL

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.