Sie könnten diese DELETE-Abfrage verwenden, die generisch ist und leicht angepasst werden kann, um mehr Felder zu unterstützen:
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
Siehe fiddle hier .
Diese Abfrage gibt die maximale Anzahl von Nicht-Null-Feldern für jede E-Mail zurück:
SELECT
emails,
MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
FROM
tablename
GROUP BY
emails
Ich verbinde diese Abfrage dann mit Tabellenname, um die minimale ID für jede E-Mail zu erhalten, die die maximale Anzahl von Nicht-Null-Feldern enthält:
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
und dann lösche ich alle Zeilen, die eine ID haben, die von dieser Abfrage nicht zurückgegeben wird.