Bạn có thể sử dụng truy vấn DELETE này, là truy vấn chung và có thể dễ dàng điều chỉnh để hỗ trợ nhiều trường hơn:
DELETE tablename.*
FROM
tablename LEFT JOIN (
SELECT MIN(id) min_id
FROM
tablename t INNER JOIN (
SELECT
emails, MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
FROM
tablename
GROUP BY
emails) m
ON t.emails=m.emails
AND ((t.name IS NOT NULL) + (t.surname IS NOT NULL))=m.max_non_nulls
GROUP BY
t.emails) ids
ON tablename.id=ids.min_id
WHERE
ids.min_id IS NULL
Vui lòng xem fiddle tại đây .
Truy vấn này trả về số lượng trường không rỗng tối đa cho mọi email:
SELECT
emails,
MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
FROM
tablename
GROUP BY
emails
Sau đó, tôi kết hợp truy vấn này với tên bảng, để nhận ID tối thiểu cho mọi email có số trường không rỗng tối đa:
SELECT MIN(id) min_id
FROM
tablename t INNER JOIN (
SELECT
emails, MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
FROM
tablename
GROUP BY
emails) m
ON t.emails=m.emails
AND ((t.name IS NOT NULL) + (t.surname IS NOT NULL))=m.max_non_nulls
GROUP BY
t.emails
và sau đó tôi sẽ xóa tất cả các hàng có ID không được trả về bởi truy vấn này.