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

Requêtes MySQL Discussion :

Requête sur des doublons


Sujet :

Requêtes MySQL

  1. #1
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut Requête sur des doublons
    Bonjour à tous,

    J'ai un souci de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Dans Ma table j'ai les lignes :
     
    -------------------------------------------------
    |PN	|PP	|Nom	|Prenom	|DateNaissance	|
    -------------------------------------------------
    |50	|42	|Dupont |Albert	|12-02-1978	|
    |50	|42	|Dupont |Albert	|12-02-1978	|
    |50	|42	|Dupont |Toto	|12-02-1978	|
    |50	|42	|Durand |Roger	|12-02-1978	|
    -------------------------------------------------
     
    et je veux afficher ce résultat :
    -------------------------------------------------
    |PN	|PP	|Nom	|Prenom	|DateNaissance	|
    -------------------------------------------------
    |50	|42	|Dupont |Albert	|12-02-1978	|
    |50	|42	|Dupont |Toto	|12-02-1978	|
    |50	|42	|Durand |Roger	|12-02-1978	|
    -------------------------------------------------
    Donc voilà ce que doit faire ma requête :

    Sélectionner tous les doublons même PN - même PP - même dateNaissance
    et les regrouper par Nom- prenom- DateNaissance :
    Donc ne prendre qu'une ligne quand le doublon est aussi sur les nom et prénom
    (ici Dupont Albert présent 2 fois n'est affiché qu'une fois)

    Pour l'instant j'y arrive en passant par une requête intermédiaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT(*) AS NBR_DOUBLES, PN, PP, DateNaissance
    FROM clients
    GROUP BY PN, PP, DateNaissance
    HAVING COUNT(*) >1
    Mais après je parcours le résultat pour faite une deuxième requête avec un
    GROUP BY Nom, Prenom, DateNaissance...

    C'est pas très propre et c'est gourmand.
    Il y a forcément la requête qui va bien (imbriquée ?) pour me retourner ce résultat en une fois, non ?

    Merci pour votre aide.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    L'exemple de données ne reflète peut-être pas la diversité des cas mais ici un simlple DISTINCT sur toutes les colonnes ferait l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT PN, PP, Nom, Prenom, DateNaissance
    FROM clients
    ORDER BY Nom, Prenom, DateNaissance

  3. #3
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    Merci pour la réponse.

    Mon exemple est en effet un peu raccourci, car je n'y ai mis que des doublons.
    Dans la vraie table, il s'agit de ne relever que les doublons PN-PP (HAVING COUNT > 1)
    Et qui ne représentent que 5% du total des lignes.

    donc ça pourrait être ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    -------------------------------------------------
    |PN	|PP	|Nom	|Prenom	   |DateNaissance|
    -------------------------------------------------
    |21	|25	|Legrand|Christian|12-02-1978	 |
    |50	|42	|Dupont |Albert	  |12-02-1978	 |
    |50	|42	|Dupont |Albert	  |12-02-1978	 |
    |50	|42	|Dupont |Toto	  |12-02-1978	 |
    |50	|42	|Durand |Roger	  |12-02-1978	 |
    -------------------------------------------------
     
    et je veux afficher ce résultat :
    -------------------------------------------------
    |PN	|PP	|Nom	|Prenom	|DateNaissance	|
    -------------------------------------------------
    |50	|42	|Dupont |Albert	|12-02-1978	|
    |50	|42	|Dupont |Toto	|12-02-1978	|
    |50	|42	|Durand |Roger	|12-02-1978	|
    -------------------------------------------------

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT DISTINCT c.Nom, c.Prenom
    FROM clients AS c
    INNER JOIN (
      SELECT COUNT(*) AS NBR_DOUBLES, PN, PP, DateNaissance
      FROM clients
      GROUP BY PN, PP, DateNaissance
      HAVING COUNT(*) >1
    ) As t 
      ON c.PN = t.PN
        AND c.PP = t.PP
        AND c.DateNaissance = t.DateNaissance
    ORDER BY c.Nom, c.Prenom
    Mais ça risque d'être gourmand quand même !
    Il faut que PN, PP et DateNaissance soient indexés.

  5. #5
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    J'ai bien indexé mes champs, la requête est assez rapide.
    Mais je n'ai que les champs Nom et Prenom dans le résultat.
    Je n'ai pas les champs de la jointure...

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par renaudjuif Voir le message
    Mais je n'ai que les champs Nom et Prenom dans le résultat.
    Ben évidemment ! C'est ce que j'ai mis dans le SELECT !

    A toi d'adpater avec les colonnes que tu veux !

  7. #7
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    Oui...
    Il est 13h55, et j'ai pas encore mangé... on va mettre ça sur le compte de la fatigue

    Ça marche effectivement bien, Merci !
    J'essaie d'affiner, car ça me retourne encore trop de résultats...

    En fait, je veux que ça ne me retourne que les nom-prénom différents avec même Phonex (les champs PP & PN sont les Phonex nom & prenom)

    Or là, ça me retourne bien sur tous les doublons, y compris ceux ayant les mêmes nom-prenom, donc pour reprendre mon exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    -------------------------------------------------
    |PN	|PP	|Nom	 |Prenom   |DateNaissance|
    -------------------------------------------------
    |35	|78	|Lefebvre|Olivier  |02-10-1980	 |
    |35	|78	|Lefebvre|Olivier  |02-10-1980	 |
    |21	|25	|Legrand |Christian|12-02-1978	 |
    |50	|42	|Dupont  |Albert   |12-02-1978	 |
    |50	|42	|Dupont  |Albert   |12-02-1978	 |
    |50	|42	|Dupont  |Toto	   |12-02-1978	 |
    |50	|42	|Durand  |Roger	   |12-02-1978	 |
    -------------------------------------------------
     
    devrait me retourner :
    -------------------------------------------------
    |PN	|PP	|Nom	|Prenom	|DateNaissance	|
    -------------------------------------------------
    |50	|42	|Dupont |Albert	|12-02-1978	|
    |50	|42	|Dupont |Toto	|12-02-1978	|
    |50	|42	|Durand |Roger	|12-02-1978	|
    -------------------------------------------------
    Le doublon Lefebvre Olivier n'est pas retourné car il n'a pas de correspondance Phonex avec des nom-prénom différents

    Voilà, désolé je livre un peu l'info au compte-goutte, mais c'est en avançant que je m'aperçois des petites corrections à faire.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT c.Nom, c.Prenom
    FROM clients AS c
    INNER JOIN (
      SELECT COUNT(*) AS NBR_DOUBLES, PN, PP, DateNaissance
      FROM clients
      GROUP BY PN, PP, DateNaissance
      HAVING COUNT(*) >1
    ) AS t 
      ON c.PN = t.PN
        AND c.PP = t.PP
        AND c.DateNaissance = t.DateNaissance
    GROUP BY c.Nom, c.Prenom
    HAVING COUNT(*) > 1

  9. #9
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    ça me retourne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ------------------------------------------------
    |PN	|PP	|Nom	|Prenom	|DateNaissance	 |
    ------------------------------------------------
    |50	|42	|Dupont |Albert	|12-02-1978	 |
    |35	|78	|Lefebvre|Olivier  |02-10-1980	 |
    ------------------------------------------------
    avant de faire le GROUP BY, on a ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    -------------------------------------------------
    |PN	|PP	|Nom	|Prenom	|DateNaissance	 |
    -------------------------------------------------
    |50	|42	|Dupont  |Albert   |12-02-1978	 |
    |50	|42	|Dupont  |Albert   |12-02-1978	 |
    |50	|42	|Dupont  |Toto	 |12-02-1978	 |
    |50	|42	|Durand  |Roger	 |12-02-1978	 |
    |35	|78	|Lefebvre|Olivier   |02-10-1980	 |
    |35	|78	|Lefebvre|Olivier   |02-10-1980	 |
    -------------------------------------------------
    Il faudrait de ce résultat ne retenir que les lignes trouvées avec
    même PN et même PP, mais nom ou prenom différent :
    Lefebvre est éliminé, et reste les 3 lignes (2 Dupont & 1 Durand)

    C'est pas simple...

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Je suis arrivé au résultat mais la requête est complexe.
    Si la table à analyser est grande, ça risque de prendre du temps !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    SELECT DISTINCT c1.PP, c1.PN, c1.Nom, c1.Prenom, c1.DateNaissance
    FROM clients AS c1
    INNER JOIN (
      SELECT t1.PN, t1.PP, t1.DateNaissance
      FROM (
        SELECT DISTINCT c.PN, c.PP, c.Nom, c.Prenom, c.DateNaissance
        FROM clients AS c
        INNER JOIN (
          SELECT COUNT(*) AS NBR_DOUBLES, PN, PP, DateNaissance
          FROM clients
          GROUP BY PN, PP, DateNaissance
          HAVING COUNT(*) >1
        ) AS t 
          ON c.PN = t.PN
        AND c.PP = t.PP
        AND c.DateNaissance = t.DateNaissance
      ) AS t1
      GROUP BY t1.PN, t1.PP, t1.DateNaissance
      HAVING COUNT(*) > 1
    ) AS t2 
      ON t2.PP = c1.PP
        AND t2.PN = c1.PN
        AND t2.DateNaissance = c1.DateNaissance
    ORDER BY c1.Nom, c1.Prenom

  11. #11
    Membre actif Avatar de renaudjuif
    Inscrit en
    Avril 2006
    Messages
    325
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 325
    Points : 258
    Points
    258
    Par défaut
    Excellent !!!

    J'ai une table de 50.000 lignes, la requête s'exécute en 0.87 sec. donc tout va bien.
    Effectivement, la requête n'est pas simple...

    Un grand merci pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de requête sur des doublons
    Par Bobette dans le forum Débuter
    Réponses: 7
    Dernier message: 12/04/2012, 17h15
  2. [Conception] Requête sur des dates pour stats
    Par vallica dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/05/2006, 10h15
  3. [MySQL] Problème de requête sur des dates
    Par dahu29 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2006, 13h08
  4. requêtes sur des champs date
    Par wiwi dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/02/2006, 14h14
  5. Recherche et tri sur des doublons XSLT
    Par MusSDev dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 01/06/2005, 09h27

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