Mysql
 sql >> Base de données >  >> RDS >> Mysql

MYSQL Dédupliquez et supprimez la ligne en double avec le moins de données

Vous pouvez utiliser cette requête DELETE, qui est générique et peut être facilement adaptée pour prendre en charge davantage de champs :

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

Veuillez consulter le violon ici .

Cette requête renvoie le nombre maximum de champs non nuls, pour chaque email :

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

Je joins ensuite cette requête avec tablename, pour obtenir l'ID minimum pour chaque e-mail contenant le nombre maximum de champs non nuls :

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

puis je supprime toutes les lignes qui ont un ID qui n'est pas renvoyé par cette requête.