sql >> Database >  >> RDS >> Mysql

MYSQL Ontdubbel en verwijder de dubbele rij met de minste gegevens

U kunt deze DELETE-query gebruiken, die generiek is en gemakkelijk kan worden aangepast om meer velden te ondersteunen:

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

Zie fiddle hier .

Deze zoekopdracht retourneert het maximale aantal niet-null-velden, voor elke e-mail:

SELECT
  emails,
  MAX((name IS NOT NULL) + (surname IS NOT NULL)) max_non_nulls
FROM
  tablename
GROUP BY
  emails

Ik voeg me dan bij deze query met tabelnaam, om de minimale ID te krijgen voor elke e-mail met het maximale aantal niet-nulvelden:

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

en dan verwijder ik alle rijen met een ID die niet wordt geretourneerd door deze zoekopdracht.



  1. Hoe voeg ik een stem toe aan mijn database in een formulier?

  2. Google OAuth 2.0 Gebruikers-ID datatype voor MYSQL

  3. Hoe maak je een externe sleutel in Oracle SQL Developer?

  4. Toegestane geheugengrootte van 134217728 bytes uitgeput (geprobeerd om 42 bytes toe te wijzen)