Để tìm các bản ghi trùng lặp dựa trên giá trị của một cột, sử dụng truy vấn con (subquery) với GROUP BY và HAVING COUNT(*) > 1.
Tạo bảng có khóa chính tự động tăng
mysql> CREATE TABLE DemoTable (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name VARCHAR(100)
-> );
Query OK, 0 rows affected (0.87 sec)
Chèn dữ liệu có trùng lặp
mysql> INSERT INTO DemoTable(Name) VALUES('John');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Chris');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('John');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('David');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Bob');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Chris');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Mike');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Robert');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Mike');
Query OK, 1 row affected (0.12 sec)
Truy vấn chọn tất cả bản ghi trùng lặp
mysql> SELECT * FROM DemoTable
-> WHERE Name IN (
-> SELECT Name FROM DemoTable
-> GROUP BY Name
-> HAVING COUNT(*) > 1
-> );
Kết quả (hiển thị cả các bản ghi John, Chris, Mike xuất hiện nhiều lần):
+----+-------+ | Id | Name | +----+-------+ | 1 | John | | 2 | Chris | | 3 | John | | 6 | Chris | | 7 | Mike | | 9 | Mike | +----+-------+ 6 rows in set (0.09 sec)
Lưu ý: Truy vấn này trả về tất cả các bản ghi thuộc nhóm trùng lặp, không chỉ các bản ghi thừa.