आप इस DELETE क्वेरी का उपयोग कर सकते हैं, जो सामान्य है और अधिक क्षेत्रों का समर्थन करने के लिए इसे आसानी से अनुकूलित किया जा सकता है:
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
कृपया फिडल देखें यहां ।
यह क्वेरी प्रत्येक ईमेल के लिए अधिकतम संख्या में गैर-शून्य फ़ील्ड लौटाती है:
SELECT
emails,
MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
FROM
tablename
GROUP BY
emails
फिर मैं इस क्वेरी को टैबलेटनाम के साथ जोड़ रहा हूं, प्रत्येक ईमेल के लिए न्यूनतम आईडी प्राप्त करने के लिए जिसमें अधिकतम संख्या में गैर-शून्य फ़ील्ड हैं:
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
और फिर मैं उन सभी पंक्तियों को हटा रहा हूं जिनमें एक आईडी है जो इस क्वेरी द्वारा वापस नहीं की गई है।