Supprimer toutes les lignes en double sauf une dans MySQL?

Duplication possible:
Supprimer les lignes en double dans MySQL

Comment supprimer toutes les données en double d’une table MySQL?

Par exemple, avec les données suivantes:

SELECT * FROM names; +----+--------+ | id | name | +----+--------+ | 1 | google | | 2 | yahoo | | 3 | msn | | 4 | google | | 5 | google | | 6 | yahoo | +----+--------+ 

J’utiliserais les SELECT DISTINCT name FROM names; s’il s’agissait d’une requête SELECT .

Comment puis-je faire cela avec DELETE pour supprimer uniquement les doublons et ne conserver qu’un seul enregistrement de chacun?

Avertissement de l’éditeur: Cette solution est inefficace du sharepoint vue du calcul et peut entraîner votre connexion pour une grande table.

NB – Vous devez d’abord le faire sur une copie de test de votre table!

Lorsque je l’ai fait, j’ai constaté qu’à moins d’inclure AND n1.id <> n2.id , il supprimait toutes les lignes de la table.

  1. Si vous souhaitez conserver la ligne avec la valeur d’ id la plus basse:

     DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name 
  2. Si vous souhaitez conserver la ligne avec la valeur d’ id la plus élevée:

     DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name 

J'ai utilisé cette méthode en MySQL 5.1

Pas sûr des autres versions.


Mise à jour: Étant donné que les gens cherchant à supprimer les doublons se retrouvent ici
Bien que la question du PO concerne DELETE , veuillez noter que l'utilisation de INSERT et DISTINCT est beaucoup plus rapide. Pour une firebase database de 8 millions de lignes, la requête ci-dessous a pris 13 minutes, tandis que l'utilisation de DELETE a duré plus de 2 heures et n'a pas abouti.

 INSERT INTO tempTableName(cellId,atsortingbuteId,entityRowId,value) SELECT DISTINCT cellId,atsortingbuteId,entityRowId,value FROM tableName; 

Si vous souhaitez conserver la ligne avec la valeur d’ id la plus basse:

 DELETE FROM NAMES WHERE id NOT IN (SELECT * FROM (SELECT MIN(n.id) FROM NAMES n GROUP BY n.name) x) 

Si vous voulez la valeur d’ id la plus élevée:

 DELETE FROM NAMES WHERE id NOT IN (SELECT * FROM (SELECT MAX(n.id) FROM NAMES n GROUP BY n.name) x) 

La sous-requête dans une sous-requête est nécessaire pour MySQL ou vous obtenez une erreur 1093.