MySQL supprimer des enregistrements en double, mais gardez dernière
J'ai uniques id
et email
champs. Les courriers électroniques sont dupliqués. Je veux seulement garder une adresse e-Mail de toutes les doublons mais avec la dernière id
(le dernier enregistrement inséré).
Comment puis-je y parvenir?
- Avez-vous essayé de faire une recherche? possible en double how-do-i-delete-duplicate-rows-and-keep-the-first-row
- pourquoi ne pas simplement éviter les doublons d'être insérées dans la table? faire des e-mail d'un index unique
- copain je suis comme 20 threads encore ouvert, mais n'étant pas une base de données pro, tous ceux qui ont certaines conditions qui en font la requête assez difficile à comprendre, donc j'ai fait un nouveau thread avec beaucoup d'excuses @tofutim: Tim, nous avons obtenu ces données à partir d'un tiers afin de cant choisir bien. Donc nettoyage jusqu'à maintenant. 🙂
- s'il vous plaît ne pas commencer ou se terminer vos messages avec des excuses, il n'est pas ajouter quoi que ce soit de valeur à la question et souvent il n'y a pas d'excuses nécessaire. Juste obtenir directement au point 🙂 peut-être utiliser un commentaire à la place si vous en ressentez le besoin.
Vous devez vous connecter pour publier un commentaire.
Imaginez votre table
test
contient les données suivantes:Donc, nous avons besoin de trouver tous répété e-mails et de les supprimer tous d'entre eux, mais le dernier id.
Dans ce cas,
aaa
,bbb
eteee
sont répétées, afin que nous voulons supprimer les Id 1, 7, 2 et 6.Pour ce faire, nous avons d'abord besoin de trouver tous les e-mails répétés:
Puis, à partir de ces données, nous avons besoin de trouver la dernière id pour chacun de ces e-mails répétés:
Enfin, nous pouvons maintenant supprimer tous ces e-mails avec un Id plus petit que LASTID. Donc la solution est:
Je n'ai pas de mySql installé sur cette machine, mais devrait fonctionner
Mise à jour
Ci-dessus supprimer fonctionne, mais j'ai trouvé un plus version optimisée:
Vous pouvez voir qu'il supprime la plus ancienne des doublons, c'est à dire 1, 7, 2, 6:
Une autre version, c'est la suppression de la provived par René Limon
id
etemail
colonnes. Si vous avez déjà ces index créé, assurez-vous que les statistiques sont mises à jour en exécutantANALYZE TABLE
. Vous pouvez exécuter uneEXPLAIN SELECT
pour inspecter ce qui ne va pas, voir dev.mysql.com/doc/refman/5.0/en/using-explain.htmlUsing filesort
etUsing temporary
qui provoque un retard. Je sais que la table temporaire est utilisé pour stocker le résultat de la sous-requête et filesort est utilisé par le groupe par. bah..delete test
parselect *
pour avoir un aperçu de ce qui va être supprimé.DELETE FROM test WHERE id NOT IN (SELECT MAX(id) FROM test GROUP BY email)
Table 'test' is specified twice, both as a target for 'DELETE' and as a separate source for data
delete from test where id not in ( SELECT * FROM (select max(id) from test group by email) AS S)
(j'ai ajouté les majuscules partie)Manière correcte est
Essayer cette méthode
Je dois dire que la version optimisée est un doux, élégant morceau de code, et il fonctionne comme un charme, même lorsque la comparaison est effectuée sur une colonne DATETIME. C'est ce que j'ai utilisé dans mon script, où j'étais à la recherche de la dernière date de fin du contrat pour chaque Employé:
Merci beaucoup!