Để phát hiện các hàng trùng lặp dựa trên **kết hợp nhiều cột** (khóa tổ hợp), hãy dùng GROUP BY trên nhóm cột đó và HAVING COUNT(*) >= 2.
Cú pháp
SELECT cot_1, cot_2, ..., COUNT(*) AS so_luong FROM ten_bang GROUP BY cot_1, cot_2, ... HAVING COUNT(*) >= 2;
Ví dụ minh họa
Tạo bảng giao hàng với ngày và quốc gia:
mysql> CREATE TABLE DemoTable1494 (
-> ShippingDate DATETIME,
-> CustomerCountryName VARCHAR(20)
-> );
Chèn dữ liệu (có trùng lặp theo cặp Ngày+Quốc gia):
mysql> INSERT INTO DemoTable1494 VALUES
-> ('2018-09-10 12:34:50', 'US'),
-> ('2019-09-10 12:34:50', 'AUS'),
-> ('2018-09-10 11:00:00', 'US'),
-> ('2017-12-31 01:10:40', 'UK'),
-> ('2019-09-10 05:00:50', 'AUS');
Truy vấn tìm cặp (Ngày, Quốc gia) xuất hiện ≥ 2 lần (nhóm theo phần ngày của ShippingDate):
mysql> SELECT ShippingDate, CustomerCountryName, COUNT(*) AS c
-> FROM DemoTable1494
-> GROUP BY DATE(ShippingDate), CustomerCountryName
-> HAVING c >= 2
-> ORDER BY c;
Kết quả:
+---------------------+---------------------+---+ | ShippingDate | CustomerCountryName | c | +---------------------+---------------------+---+ | 2018-09-10 12:34:50 | US | 2 | | 2019-09-10 12:34:50 | AUS | 2 | +---------------------+---------------------+---+
Giải thích
GROUP BY DATE(ShippingDate), CustomerCountryName: gom nhóm theo **ngày** (bỏ giờ) và quốc gia.HAVING c >= 2: chỉ giữ nhóm có từ 2 bản ghi trở lên.- Kết quả hiển thị một hàng đại diện cho mỗi nhóm trùng lặp (giá trị ShippingDate lấy hàng đầu trong nhóm).
Mở rộng
- Để xem **tất cả các hàng** thuộc nhóm trùng lặp, dùng window function (MySQL 8.0+):
SELECT * FROM (SELECT *, COUNT(*) OVER (PARTITION BY DATE(ShippingDate), CustomerCountryName) AS cnt FROM DemoTable1494) t WHERE cnt >= 2; - Tạo unique index trên
(DATE(ShippingDate), CustomerCountryName)để ngăn chặn trùng lặp ở cấp schema.