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 :

trouver les deux éléments du doublon [MySQL-5.6]


Sujet :

MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Novembre 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Novembre 2015
    Messages : 1
    Points : 5
    Points
    5
    Par défaut trouver les deux éléments du doublon
    Bonjour,
    Avec ce code je trouve bien un élément de chaque doublon :

    SELECT * FROM VI
    GROUP BY DATEDN, NOM, PRENOM, SEXE
    HAVING COUNT(*) > 1);

    Mais je cherche les deux éléments de chaque doublon. (et non pas un seul).
    (soit dans une nouvelle requête, soit dans la même en complétant celle que j'ai écrite).

    Merci.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Si vous avez un identifiant dans votre table, j'ose espérer que c'est le cas , faites comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT VI1.ID, 
           VI1.NOM,
           VI1.PRENOM,
           VI1.DATEDN,
           VI1.SEXE,
           VI2.ID 
    FROM VI VI1
    INNER JOIN VI VI2
      ON VI2.DATEDN=VI1.DATEDN
     AND VI2.NOM   =VI1.NOM
     AND VI2.PRENOM=VI1.PRENOM
     AND VI2.SEXE  =VI1.SEXE
     AND VI2.ID   <>VI1.ID

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut sychel.

    Déjà, tu ne respectes pas la syntaxe du 'group by' en mysql.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select datedn, nom, prenom, sexe, count(*) as 'nbr'
    from vi
    group by datedn, nom, prenom, sexe
    having nbr > 1
    order by datedn, nom, prenom, sexe;
    Avec ta solution, tu peux lister tous les tuples ayant un doublon.
    Pour ce faire, tu peux créer une sous-requête corrélée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select id, datedn, nom, prenom, sexe
    from vi as tb1
    where exists (select 1
    	from vi as tb2
    	group by datedn, nom, prenom, sexe
    	where tb2.datedn = tb1.datedn
    	and   tb2.nom    = tb1.nom
    	and   tb2.prenom = tb1.prenom
    	and   tb2.sexe   = tb1.sexe
    	);
    Oui, mais voila, en mysql, les requêtes corrélées ne sont pas très performantes.
    Pour remédier à cela, il suffit d'utiliser une jointure, comme l'a fait Escartefigue.

    Pour supprimer les doublons, tu peux utiliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    delete t1 from vi as t1
    inner     join vi as t2
    on   t2.datedn = t1.datedn
    and  t2.nom    = t1.nom
    and  t2.prenom = t1.prenom
    and  t2.sexe   = t1.sexe
    and  t2.id     < t1.id;
    Cela n'a pas été testé donc à vérifier.

    Sinon, si tu veux supprimer tes doublons, il y a une autre solution plus simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alter ignore table vi add unique index doublon (datedn, nom, prenom, sexe);
    alter table vi drop index doublon;
    Ce que tu fais, c'est créer un index unique sur tes quatre colonnes.
    Avec le 'ignore', tu n'as pas d'erreurs et les doublons sont tous supprimés.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Déjà, tu ne respectes pas la syntaxe du 'group by' en mysql.
    En effet, ni en quelque autre SGBD que ce soit

    Citation Envoyé par Artemus24 Voir le message
    Pour ce faire, tu peux créer une sous-requête corrélée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select id, datedn, nom, prenom, sexe
    from vi as tb1
    where exists (select 1
    	from vi as tb2
    	group by datedn, nom, prenom, sexe
    	where tb2.datedn = tb1.datedn
    	and   tb2.nom    = tb1.nom
    	and   tb2.prenom = tb1.prenom
    	and   tb2.sexe   = tb1.sexe
    	);
    Le souci avec cette solution, c'est que l'on affiche les lignes pour lesquelles on a des doublons, mais on ne sait pas avec quel autre identifiant il y a doublon, donc info incomplète
    C'est pourquoi j'ai proposé une auto-jointure qui permet d'afficher 2 à 2, les identifiants en doublon, avec plusieurs lignes si nécessaire.

    Par contre, le souci qu'il peut y avoir avec l'autojointure que j'ai proposée est la performance s'il n'y a pas d'index sur tout ou partie des colonnes nom, prénom, sexe, date de naissance.
    En effet, la comparaison sur l'identifiant est de type <> et pour cause, or <> n'est pas sargable.

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Escartefigue.

    Citation Envoyé par Escartefigue
    Le souci avec cette solution, c'est que l'on affiche les lignes pour lesquelles on a des doublons, mais on ne sait pas avec quel autre identifiant il y a doublon, donc info incomplète
    Je ne comprends pas trop ce que tu entends par "info incomplète".

    Le select ne sort que des lignes qui sont en double. Si tu veux regrouper visuellement les doublons, il suffit d'ajouter un tri sur le critère du doublon. Et je pense que c'est largement suffisant !

    Citation Envoyé par Escartefigue
    C'est pourquoi j'ai proposé une auto-jointure qui permet d'afficher 2 à 2, les identifiants en doublon, avec plusieurs lignes si nécessaire.
    Si tu as quatre doublons, dans mon cas, tu auras quatre lignes, alors que dans ton cas, tu auras douze lignes (4X3=12).

    Citation Envoyé par Escartefigue
    Par contre, le souci qu'il peut y avoir avec l’auto jointure que j'ai proposée est la performance s'il n'y a pas d'index sur tout ou partie des colonnes nom, prénom, sexe, date de naissance.
    Il ne s'agit pas d'être perfectionniste mais juste de répondre à une question afin que le demandeur puisse résoudre son problème.

    Mais vu le peu d'information qu'il nous a communiqué, on a fait notre possible pour le satisfaire.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Je ne comprends pas trop ce que tu entends par "info incomplète".
    En général, quand on veut identifier les doublons, c'est qu'on veut ensuite savoir lequel il faut conserver
    Il faut donc dire M. Dupont Georges identifiant n° 12 est en doublon avec l'identifiant n°548 (qui s'appelle également Dupont Georges)
    Ainsi l'utilisateur n'aura pas à chercher quel est (ou quels sont) les autres identifiants en double

    Citation Envoyé par Artemus24 Voir le message
    Si tu as quatre doublons, dans mon cas, tu auras quatre lignes, alors que dans ton cas, tu auras douze lignes (4X3=12).
    Vrai, j'ai oublié le tri et le test de supériorité sur l'identifiant, pour n'afficher qu'une fois chaque double, merci

    Citation Envoyé par Artemus24 Voir le message
    Il ne s'agit pas d'être perfectionniste mais juste de répondre à une question afin que le demandeur puisse résoudre son problème.
    Sauf que si sa table contient des centaines de millions de lignes, faute d'index éligible, la requete va tourner des heures, c'est pourquoi il est sage de prévenir

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Escartefigue.

    Citation Envoyé par Escartefigue
    En général, quand on veut identifier les doublons, c'est qu'on veut ensuite savoir lequel il faut conserver
    Oui, d'accord, mais la liste que l'on obtient, contient que des lignes en double sur le critère que tu as choisi.
    Je ne vais pas ajouter dans cette liste, ceux qui ne sont pas en double, cela va de soi.

    Ensuite, il faut trouver un critère de conservation. En général, c'est arbitraire.
    MySql conserve la première occurrence, mais ce n'est pas toujours bon de procéder ainsi.
    Cela dépend aussi des autres colonnes qui sont renseignées ou pas (un NULL par exemple).

    Pour affiner ta sélection, il faut ajouter d'autres critères, ce qui va alourdir ta requête.

    Citation Envoyé par Escartefigue
    Il faut donc dire M. Dupont Georges identifiant n° 12 est en doublon avec l'identifiant n°548 (qui s'appelle également Dupont Georges)
    Je ne voie pas trop l'intérêt de procéder par couple, c'est-à-dire de mettre en relation une ligne avec une autre, juste pour indiquer que j'ai deux doublons.
    Tout ce dont j'ai besoin, c'est la liste de tous les doublons. Après je peux trier cette ligne pour mettre en concordance ces doublons.

    Citation Envoyé par Escartefigue
    Sauf que si sa table contient des centaines de millions de lignes, faute d'index éligible, la requete va tourner des heures, c'est pourquoi il est sage de prévenir.
    Oui, j'avais bien compris qu'il vaut bien prévenir.

    Je veux signifier qu'ici, sychel n'a pas donné plus d'information sur ce qu'il cherche à faire.
    Tout ce qu'il veut faire, c'est obtenir la liste de toutes les lignes en double.
    On ne sait même pas s'il va les supprimer ou faire quoi que ce soit d'autre.
    On ne connait pas non plus le descriptif de sa table, ni s'il a créé des index.
    Donc inutile de faire des hypothèses. Attendons une réponse de sa part.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 11/11/2015, 13h38
  2. Trouver les éléments non communs entre deux matrices
    Par Décembre dans le forum MATLAB
    Réponses: 1
    Dernier message: 02/10/2011, 18h31
  3. trouver les éléments communs entre deux vecteurs
    Par Décembre dans le forum MATLAB
    Réponses: 5
    Dernier message: 21/07/2010, 09h38
  4. Trouver les éléments identiques dans deux listes
    Par ricololo dans le forum MATLAB
    Réponses: 4
    Dernier message: 29/01/2009, 13h25
  5. Trouver les deux points les plus éloignés
    Par giloutho dans le forum Algorithmes et structures de données
    Réponses: 24
    Dernier message: 13/04/2008, 01h48

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