Comment supprimer les enregistrements en double dans MySQL tout en conservant les dernières
Lorsque vous traitez des tables contenant des identifiants uniques et des adresses e-mail en double, il est il est souvent nécessaire de supprimer ces doublons tout en préservant l'enregistrement le plus récent. MySQL propose plusieurs méthodes pour atteindre cet objectif.
Une approche consiste à identifier les adresses e-mail répétées et à trouver l'enregistrement le plus récent, représenté par l'ID maximum, pour chacun de ces e-mails. Cela peut être fait en utilisant une combinaison des fonctions GROUP BY, HAVING et MAX().
Une fois les enregistrements les plus récents identifiés, l'étape suivante consiste à supprimer tous les enregistrements en double avec un ID inférieur à leur ID maximum respectif. Cela peut être accompli avec une instruction DELETE qui utilise un INNER JOIN pour comparer les adresses e-mail et les valeurs d'ID.
Exemple de table de base de données
Pour illustrer ce processus, considérons le tableau suivant nommé "test":
ID EMAIL ---------------------- -------------------- 1 aaa 2 bbb 3 ccc 4 bbb 5 ddd 6 eee 7 aaa 8 aaa 9 eee
Identification du doublon E-mails
select email from test group by email having count(*) > 1;
Cette requête renvoie le résultat suivant, indiquant que « aaa », « bbb » et « eee » sont des e-mails répétés :
EMAIL -------------------- aaa bbb eee
Recherche des enregistrements les plus récents
select max(id) as lastId, email from test where email in ( select email from test group by email having count(*) > 1 ) group by email;
Cette requête récupère l'ID maximum et l'adresse e-mail correspondante pour chaque duplicate :
LASTID EMAIL ---------------------- -------------------- 8 aaa 4 bbb 9 eee
Suppression des enregistrements en double
delete test from test inner join ( select max(id) as lastId, email from test where email in ( select email from test group by email having count(*) > 1 ) group by email ) duplic on duplic.email = test.email where test.id < duplic.lastId;
Après avoir exécuté cette requête, la table "test" contiendra uniquement les enregistrements les plus récents pour chaque adresse e-mail , ce qui donne les données suivantes :
+----+-------+ | id | email | +----+-------+ | 3 | ccc | | 4 | bbb | | 5 | ddd | | 8 | aaa | | 9 | eee | +----+-------+
Suppression optimisée Requête
Une requête de suppression alternative, plus optimisée, est fournie ci-dessous :
delete from test where id not in ( select max(id) from test group by email)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!