Để loại bỏ trùng lặp và chỉ giữ một bản ghi cho mỗi giá trị, sử dụng GROUP BY kết hợp với hàm tổng hợp như MIN() hoặc MAX().
Cú pháp
SELECT MIN(cột_id), cột_giá_trị FROM tên_bảng GROUP BY cột_giá_trị;
Ví dụ minh họa
Tạo bảng demo:
mysql> CREATE TABLE doNotSelectDuplicateValuesDemo (
-> User_Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> User_Name VARCHAR(20)
-> );
Query OK, 0 rows affected (0.78 sec)
Chèn dữ liệu có trùng lặp:
mysql> INSERT INTO doNotSelectDuplicateValuesDemo(User_Name) VALUES
-> ('John'), ('Carol'), ('Carol'), ('Carol'), ('Sam'), ('Mike'),
-> ('Bob'), ('David'), ('Maxwell'), ('Bob'), ('Ramit');
Xem dữ liệu gốc (11 hàng, có trùng):
mysql> SELECT * FROM doNotSelectDuplicateValuesDemo;
+---------+-----------+ | User_Id | User_Name | +---------+-----------+ | 1 | John | | 2 | Carol | | 3 | Carol | | 4 | Carol | | 5 | Sam | | 6 | Mike | | 7 | Bob | | 8 | David | | 9 | Maxwell | | 10 | Bob | | 11 | Ramit | +---------+-----------+
Lấy một bản ghi cho mỗi tên (lấy User_Id nhỏ nhất):
mysql> SELECT MIN(User_Id), User_Name
-> FROM doNotSelectDuplicateValuesDemo
-> GROUP BY User_Name;
+--------------+-----------+ | min(User_Id) | User_Name | +--------------+-----------+ | 1 | John | | 2 | Carol | | 5 | Sam | | 6 | Mike | | 7 | Bob | | 8 | David | | 9 | Maxwell | | 11 | Ramit | +--------------+-----------+
Phương pháp khác: DISTINCT
Nếu chỉ cần giá trị duy nhất, không quan tâm ID:
SELECT DISTINCT User_Name FROM doNotSelectDuplicateValuesDemo;
Phương pháp hiện đại (MySQL 8.0+): ROW_NUMBER()
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY User_Name ORDER BY User_Id) AS rn
FROM doNotSelectDuplicateValuesDemo
)
SELECT User_Id, User_Name FROM ranked WHERE rn = 1;
Cách này linh hoạt hơn khi cần logic phức tạp hơn (ví dụ: lấy bản ghi mới nhất, bản ghi có điểm cao nhất, v.v.)