IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 MySQL Discussion :

doublons sur plusieurs colonnes


Sujet :

MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut doublons sur plusieurs colonnes
    Bonjour,

    J'ai une table sql avec plusieurs champs. J'aimerai tester si des doublons existent sur deux de ces colonnes dans ma table pour pouvoir les supprimer.

    Comment faire?

    Merci d'avance!

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    tu peux faire ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM taTable 
    GROUP BY champ1, champ2
    HAVING COUNT(*) > 1

  3. #3
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Tu fais deux SELECT sur la même table chacun sur une des deux colonnes que tu renommes (AS) de manière identique dans les deux SELECT.
    Tu mets ces SELECTs en UNION ALL tu comptes dans un GROUP BY et tu ne retiens avec une clause HAVING que les items dont le comptage est supérieur à 1.
    Tu vas comme cela détecté les doublons (voire triplets ou plus) aussi bien entre les deux colonnes que dans chacune des colonnes.

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Plutôt marrant, nous avons eu deux interprétations de ton exposé de problème qui débouchent, chacune, sur une solution adaptée.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Voilà ce que j'ai fait:

    J'ai crée une nouvelle colonne dans laquelle j'ai concaténé mes 2 champs.
    J'utilise donc cette colonne pour trouver les doublons:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT doublon 
    FROM cv 
    WHERE `upddt` >= '2010-11-19' 
    and upddt <= '2010-11-23'  
    GROUP BY doublon 
    HAVING COUNT(doublon) > 1 
    ORDER BY `upddt`  DESC
    Maintenant comment faire pour les supprimer?

  6. #6
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    un delete avec id IN(...) ?

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Voilà ce que je fais mais j'ai une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Delete From cv c1 where c1.doublon in (SELECT c2.doublon 
    FROM cv c2
    WHERE c2.`upddt` >= '2010-11-19' 
    and c2.upddt <= '2010-11-23 10:27:01'  
    GROUP BY c2.doublon 
    HAVING COUNT(c2.doublon) > 1 
    ORDER BY `c2`.`upddt`  DESC)
    Erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c1 where c1.doublon in (SELECT c2.doublon FROM cv c2 WHERE c2.`upddt` >= '201' at line 1

  8. #8
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    de mémoire je crois que la syntaxe avec des alias est celle ci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE alias FROM table AS alias WHERE...

    Sinon attention à ton order, il s'effectuera APRES ton group by donc si tu souhaites récupérer toutes les dates décroissantes, c'est raté. J'ai l'habitude de faire même s'il y a surement mieux quelque chose du style :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT C1, C2 FROM (
       SELECT C1, C2 FROM table
       ORDER BY C2 DESC
       )
    GROUP BY C2

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    bon apparemment la requête delete n'accepte pas d'alias.

  10. #10
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Elle en accepte avec la syntaxe que je t'ai donné. Quel est le message d'erreur ?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Voici la requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DELETE c1 FROM cv AS c1 WHERE c1.doublon in
    (SELECT c2.doublon 
    FROM cv c2
    WHERE c2.`upddt` >= '2010-11-19' 
    and c2.upddt <= '2010-11-23 10:27:01'  
    GROUP BY c2.doublon 
    HAVING COUNT(c2.doublon) > 1)
    et l'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1093 - You can't specify target table 'c1' for update in FROM clause

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Dites avec cette requête, je ne sélectionne que les doublons?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c2.doublon 
    FROM cv c2
    WHERE c2.`upddt` >= '2010-11-19' 
    AND c2.upddt <= '2010-11-23 10:27:01'  
    GROUP BY c2.doublon 
    HAVING COUNT(c2.doublon) > 1
    Si je les sélectionne et que je les supprime sous phpMyAdmin, il ne me supprimera que les doublons??

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Est qu'un alter ignore add unique ne fonctionnerait pas dans mon cas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER IGNORE TABLE  cv ADD UNIQUE INDEX(candidat_id, intitule_poste, ville, cp, email);

  14. #14
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Un tutoriel sur l'éradication des doublons devrait faire ton affaire

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Merci pour l'exemple et pour la doc!

    Voilà ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELETE
    FROM   cv T
    WHERE  T.cv_id < ANY (SELECT cv_id
                        FROM   cv T2
                        WHERE  T.cv_id <> T2.cv_id
                     AND  T.candidat_id    = T2.candidat_id
                     AND  T.intitule_poste = T2.intitule_poste
    		 AND  T.ville = T2.ville
    	         AND  T.cp = T2.cp
    		 AND  T.email = T2.email)
    Mais j'ai le message d'erreur suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'T WHERE T.cv_id < ANY (SELECT cv_id FROM cv T2 ' at line 2
    Impossible de supprimer!

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    MySQL ne respecte une fois de plus pas la norme et ne connais pas ANY.

    Après quelques minutes de recherche dans le forum MySQL, la solution s'y trouve !

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Malheureusement CinePhil, ça ne fonctionne toujours pas chez moi avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE FROM cv T WHERE T.cv_id < ( SELECT MIN( T2.cv_id )
    FROM cv T2
    WHERE T.cv_id <> T2.cv_id
    AND T.candidat_id = T2.candidat_id
    AND T.intitule_poste = T2.intitule_poste
    AND T.ville = T2.ville
    AND T.cp = T2.cp
    AND T.email = T2.email )
    MySQL a réponduocumentation
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'T
    WHERE T.cv_id < ( SELECT MIN(T2.cv_id)
    FROM cv T2
    ' at line 2
    Je vais finalement me rabattre sur la requête suivante qui semble bien me supprimer les doublons:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER IGNORE TABLE  TabTest ADD UNIQUE INDEX(candidat_id, intitule_poste, ville, cp, email);
    Encore merci!

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    On a dit plus haut que l'utilisation d'alias dans un DELETE était à employer de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE alias 
    FROM la_table alias...
    Donc essaie cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DELETE T 
    FROM cv T 
    WHERE T.cv_id < ( 
        SELECT MIN( T2.cv_id )
        FROM cv T2
        WHERE T.cv_id <> T2.cv_id
            AND T.candidat_id = T2.candidat_id
            AND T.intitule_poste = T2.intitule_poste
            AND T.ville = T2.ville
            AND T.cp = T2.cp
            AND T.email = T2.email )

  19. #19
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Comme envoyé et dit par mp...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE ALIAS FROM uneTable AS ALIAS WHERE...

  20. #20
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 488
    Points : 134
    Points
    134
    Par défaut
    Erreur

    requête SQL: Documentation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DELETE T FROM cv T WHERE T.cv_id < ( SELECT MIN( T2.cv_id )
    FROM cv T2
    WHERE T.cv_id <> T2.cv_id
    AND T.candidat_id = T2.candidat_id
    AND T.intitule_poste = T2.intitule_poste
    AND T.ville = T2.ville
    AND T.cp = T2.cp
    AND T.email = T2.email )
    MySQL a réponduocumentation
    #1093 - You can't specify target table 'T' for update in FROM clause
    Rien à faire, il en veut pas mon SQL

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2010] Recherche doublons sur plusieurs colonnes
    Par David_18 dans le forum Access
    Réponses: 11
    Dernier message: 19/05/2014, 19h15
  2. Filtrer les doublons sur plusieurs colonnes
    Par henri228 dans le forum Conception
    Réponses: 2
    Dernier message: 07/05/2010, 22h21
  3. Jointure avec conditions sur plusieurs colonnes
    Par ben53 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/11/2005, 09h27
  4. Lister sur plusieurs colonnes dans état
    Par armagued dans le forum Access
    Réponses: 3
    Dernier message: 30/10/2005, 21h21
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo