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 à le recherche de doublons


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Femme Profil pro
    ...
    Inscrit en
    Avril 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : ...

    Informations forums :
    Inscription : Avril 2009
    Messages : 49
    Par défaut Requête à le recherche de doublons
    Bonjour,

    Je vous expose rapidement mon soucis : j'ai une table de ce type

    +---+-----+---------+----+---+------+
    | id | nom | prenom | tél | cp | ville |
    +---+-----+---------+----+---+------+
    | 1 | dupont | prenom | 123456 | cp | ville |
    | 2 | dupond | prenom | 123456 | cp | ville |
    | 3 | martin | prenom | 789556 | cp | ville |
    | 4 | prenom| dupont | 123456 | cp | ville |
    +---+-----+---------+----+---+------+

    Ce que je souhaiterais c'est pouvoir afficher (et non pas supprimer directement) les doublons et "faux doublons". Je m'explique, en gros j'aimerais retrouver toutes les lignes dont le numéro de téléphone est identique + nom + prénom. Or il faudrait que je puisse inclure dans la recherche les éventuelles inversion entre le nom et le prénom (par exempl la ligne 1 et 4) mais aussi les fautes d'orthographe lors de la saisie des noms. J'ai commencé à trouver cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT COUNT(T1.id) AS nb, T1.id,T1.nom, T1.prenom,T1.tel
    FROM table AS T1
    LEFT JOIN table AS T2
    ON T1.tel = T2.tel
    WHERE T1.type_ressource=17
    AND (((T1.nom LIKE BINARY CONCAT('%',T2.nom,'%')) AND (T1.prenom LIKE BINARY CONCAT('%',T2.prenom,'%')))
    OR ((T1.nom LIKE BINARY CONCAT('%',T2.prenom,'%')) AND (T1.prenom LIKE BINARY CONCAT('%',T2.nom,'%'))))
    GROUP BY T1.id 
    HAVING nb > 1
    ORDER BY tel,nom,prenom
    Ça marche pas mal mais j'aimerais pouvoir détecter une erreur de frappe comme "dupnot", je n'arrive pas à aller plus loin...J'ai essayé avec SOUNDEX mais le problème c'est qu'avec la prononciation anglaise c'est pas terrible. Avez vous des idées pour m'éclairer ?

  2. #2
    Membre chevronné Avatar de Nheo_
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 323
    Par défaut
    Bonjour,

    Je sais pas si il existe des fonctions toutes faites, sinon tu peux regarder de ce côté la :

    Distance de Levenshtein.

    Ça permet de comparer la ressemblance de deux chaînes.

  3. #3
    Membre averti
    Femme Profil pro
    ...
    Inscrit en
    Avril 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : ...

    Informations forums :
    Inscription : Avril 2009
    Messages : 49
    Par défaut
    Merci pour ta réponse.
    Je connais en effet Levenshtein, je pense que ce que je vais finir par faire si je n'arrive à rien.

    J'ai tenté une nouvelle requête qui trouve pas mal de résultats mais certains passerons tout de même à la trappe je pense :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT COUNT(T1.id) AS nb, T1.*
    FROM table AS T1
    LEFT JOIN table AS T2 ON T1.tel = T2.tel
    WHERE (((T1.nom LIKE CONCAT('%',T2.nom,'%')) AND (T1.prenom LIKE CONCAT('%',T2.prenom,'%'))) 
    OR ((T1.nom LIKE CONCAT('%',T2.prenom,'%')) AND (T1.prenom LIKE CONCAT('%',T2.nom,'%'))) 
    OR ((T1.nom LIKE(CONCAT(LEFT(T2.nom,3),'%'))) AND (T1.prenom LIKE(CONCAT(LEFT(T2.prenom,3),'%'))))
    OR ((T1.nom LIKE(CONCAT(LEFT(T2.prenom,3),'%'))) AND (T1.prenom LIKE(CONCAT(LEFT(T2.nom,3),'%')))))
    GROUP BY T1.id 
    HAVING nb > 1
    ORDER BY tel,nom,prenom

  4. #4
    Membre chevronné Avatar de Nheo_
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 323
    Par défaut
    Citation Envoyé par titinesaku Voir le message
    Merci pour ta réponse.
    ...J'ai tenté une nouvelle requête qui trouve pas mal de résultats mais certains passerons tout de même à la trappe je pense :
    De toute façon il y en aura toujours qui passeront à la trappe, même en utilisant la distance de Levenshtein .

  5. #5
    Membre averti
    Femme Profil pro
    ...
    Inscrit en
    Avril 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : ...

    Informations forums :
    Inscription : Avril 2009
    Messages : 49
    Par défaut
    Tout à fait d'accord. Après il faut que je vois si niveau performance j'y gagne au change (ou pas) Je vais essayer de faire une fonction utilisant Levenshtein en attendant d'éventuelles réponses

  6. #6
    Membre très actif
    Homme Profil pro
    Webmaster
    Inscrit en
    Septembre 2007
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webmaster
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2007
    Messages : 105
    Par défaut
    sqlpro avait fait un tutoriel pour un meilleur sondex : http://sqlpro.developpez.com/cours/soundex/

  7. #7
    Membre averti
    Femme Profil pro
    ...
    Inscrit en
    Avril 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : ...

    Informations forums :
    Inscription : Avril 2009
    Messages : 49
    Par défaut
    Je pense que je vais pouvoir me débrouiller avec toutes ces infos, merci à vous, je passe en résolu

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

Discussions similaires

  1. [MySQL] Requête pour recherche de doublons qui ne fonctionne plus : HTTP404
    Par HAbroc dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/06/2012, 11h13
  2. Requête pour rechercher des doublons partiels
    Par jubourbon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/06/2011, 11h22
  3. [AC-2003] Rechercher des doublons à partir du résultat d'une requête
    Par oplaut dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 10/07/2010, 08h34
  4. [Requête/SQL]Recherche de doublons
    Par Mr T 94 dans le forum Requêtes et SQL.
    Réponses: 14
    Dernier message: 16/04/2007, 00h51
  5. Réponses: 2
    Dernier message: 19/08/2003, 18h04

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