Maison >base de données >tutoriel mysql >Comment supprimer les enregistrements en double dans MySQL tout en conservant les dernières ?

Comment supprimer les enregistrements en double dans MySQL tout en conservant les dernières ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 13:30:11326parcourir

How to Delete Duplicate Records in MySQL While Retaining the Latest?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn