477 votes

Supprimez tous les Doublons de Lignes à l'exception de l'Un dans MySQL?

Double Possible:
Supprimer les doublons dans MySQL

Comment puis-je supprimer tous les doublons de données à partir 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  |
+----+--------+

Je voudrais utiliser SELECT DISTINCT name FROM names; si il s'agissait d'un SELECT de la requête. Comment pourrais-je faire cela avec DELETE seulement de supprimer les doublons et de conserver une trace de chaque?

1035voto

masa-255 Points 2472

Une autre solution possible que je viens de trouver:

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

si vous voulez garder la ligne avec le plus bas id de la valeur OU

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

si vous voulez garder la ligne avec le plus haut id de la valeur.

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

Pas sûr que sur les autres versions.

*NB - Vous besoin pour ce faire d'abord une copie de votre table!+ Quand je l'ai fait, j'ai trouvé que, à moins que j'ai aussi inclus ET n1.id <> n2.id, il supprimé toutes les lignes de la table.

247voto

OMG Ponies Points 144785

Si vous voulez garder la ligne avec le plus bas id valeur:

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

Si vous voulez l' id de la valeur est la plus haute:

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 aurez un 1093 erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X