Double Possible:
Supprimer les doublons dans MySQLComment 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'unSELECT
de la requête. Comment pourrais-je faire cela avecDELETE
seulement de supprimer les doublons et de conserver une trace de chaque?
- Supprimer les lignes dupliquées dans MySQL (5 réponses )
Réponses
Trop de publicités?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.
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.