Giới thiệu
Để xóa hàng trùng lặp dựa trên giá trị cột (giữ lại 1 hàng), dùng DELETE với INNER JOIN tự tham chiếu (self-join), so sánh khóa chính để giữ hàng có ID lớn hơn (hoặc nhỏ hơn).
Ví dụ minh họa
Bước 1: Tạo bảng và chèn dữ liệu trùng
CREATE TABLE demo14 (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30)
);
INSERT INTO demo14 (name) VALUES ('John'), ('David'), ('David'), ('Bob'), ('John'), ('Carol');
Bước 2: Xóa trùng, giữ hàng có id LỚN HƠN (xuất hiện sau)
DELETE tbl1 FROM demo14 tbl1
INNER JOIN demo14 tbl2
WHERE tbl1.id < tbl2.id
AND tbl1.name = tbl2.name;
Giải thích: Join bảng với chính nó. Điều kiện tbl1.id < tbl2.id đảm bảo cặp (id nhỏ, id lớn) chỉ xuất hiện 1 lần. tbl1.name = tbl2.name xác định trùng lặp. DELETE tbl1 xóa hàng có id nhỏ hơn.
Bước 3: Kết quả (giữ id 3,4,5,6)
SELECT * FROM demo14;
+----+-------+
| id | name |
+----+-------+
| 3 | David |
| 4 | Bob |
| 5 | John |
| 6 | Carol |
+----+-------+
Mẹo: Để giữ hàng đầu tiên (id nhỏ), đổi thành tbl1.id > tbl2.id. Luôn backup trước khi chạy DELETE.