Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/05/2011, 15h32   #1
Futur Membre du Club
 
Femme
Développeur Web
Inscription : avril 2009
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2009
Messages : 50
Points : 18
Points : 18
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 :
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 ?
titinesaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 15h46   #2
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
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.
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 16h04   #3
Futur Membre du Club
 
Femme
Développeur Web
Inscription : avril 2009
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2009
Messages : 50
Points : 18
Points : 18
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 :
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
titinesaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 16h10   #4
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
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 .
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 16h14   #5
Futur Membre du Club
 
Femme
Développeur Web
Inscription : avril 2009
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2009
Messages : 50
Points : 18
Points : 18
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
titinesaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 05h25   #6
Membre du Club
 
Homme Andre Parent
Webmaster
Inscription : septembre 2007
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Andre Parent
Localisation : Canada

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

Informations forums :
Inscription : septembre 2007
Messages : 96
Points : 66
Points : 66
sqlpro avait fait un tutoriel pour un meilleur sondex : http://sqlpro.developpez.com/cours/soundex/
Webselect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/05/2011, 09h29   #7
Futur Membre du Club
 
Femme
Développeur Web
Inscription : avril 2009
Messages : 50
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2009
Messages : 50
Points : 18
Points : 18
Je pense que je vais pouvoir me débrouiller avec toutes ces infos, merci à vous, je passe en résolu
titinesaku est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h53.


 
 
 
 
Partenaires

Hébergement Web