Page 1 sur 1
Requête avec LIKE mais approximatif
Posté : 26 nov. 2006, 12:19
par charabia
Bonjour !
Une petite question pour une requête avec LIKE.
Je voudrais faire une requête qui sort un résultat selon la ville. La ville ne s'écrivant jamais de la même façon (accents, majuscule, tiret...etc) :
- carrières-sur-seine
- carrieres-sur-seine
- carrières sur seine...etc
Je voudrais faire un LIKE approximatif pour qu'il détecte par exemple que ces 3 choix sont identiques.
Savez-vous si c'est possible ?
Merci !
Posté : 26 nov. 2006, 12:33
par albat
Pour commencer, voici une astuce pour résoudre les problèmes de casse (capitales et minuscules).

Tu passes tout en capitales :
$req = "SELECT champs FROM table WHERE strtoupper(ville) = strtoupper(".$ville.")";
Bon, maintenant, les tirets et autres amuseries...

Posté : 26 nov. 2006, 12:38
par charabia
Merci albat
En fait y a t-il un moyen pour qu'il reconnaisse au moins un mot dans la ville avec un LIKE ?
Etant donné que je me base aussi sur le CP je pense qu'un mot de la ville suffirait à identifier le bon résultat.
Posté : 26 nov. 2006, 12:44
par albat
Sachant qu'à un même code postal (= bureau distributeur)
peuvent être associées plusieurs communes, ça me paraît coton...
Mais, tout comme pour franchir l'obstacle de la casse,
tu peux virer tous les caractères "parasites" (tirets, etc.)
en les remplaçant systématiquement par des espaces.
Le but est de simplifier au maximum l'écriture du nom de la ville
pour pouvoir le comparer le plus facilement possible.
Ainsi :
- carrières sur seine
- Carrières sur Seine
- carrières-sur-seine
- CARRIÈRES sur-SEINE
- etc.
seront tous transformés en CARRIÈRES SUR SEINE.
Posté : 26 nov. 2006, 13:02
par charabia
Oki dac je me penche sur cette solution
Merci !
Posté : 26 nov. 2006, 13:07
par albat
Pour être tout à fait honnête, mes indications ne sont pas une solution définitive.
Elles te permettent de réduire le champ des possibles,
mais ne garantissent pas le traitement correct de tous les cas de figure.
Ainsi, si un analphabête écrit carrieres (sans accent), l'identification échouera.
L'utilisation d'un masque/motif avec LIKE est alors nécessaire.
Ou l'utilisation de regexp, peut-être...
Posté : 26 nov. 2006, 13:08
par albat
Je viens de songer qu'il te faudrait aussi supprimer les espaces inutiles :
aux extrémités de la chaîne saisie (avec un trim()), multiples à l'intérieur,...
Posté : 26 nov. 2006, 13:12
par charabia
d'accord
Je verrais avec les regex pour supprimer tous les accents avant de faire la comparaison.
Merci de ton aide

Posté : 26 nov. 2006, 14:06
par charabia
En fait quand j'y pense...
Je formatte ma variable pour qu'au final il n'y ait plus d'accents, de maj ou de tiret.
Comment je peux ensuite comparer cette variable avec mon champ ?
Dans ton exemple tu avais mis WHERE strtoupper(ville). Mais là étant donné que je fais bien plus qu'un strtoupper...je ne vois pas trop comment je peux faire.
Posté : 26 nov. 2006, 19:21
par Hubert Roksor
Pas de fontions dans les SELECT ! ça empêche l'utilisation des indices. À la place, crée un champs spécial qui contient le nom de la ville en minuscules sans accents ni tirets, etc... et qui ne servira qu'aux recherches. D'ailleurs, si tu autorises les recherches partielles il vaudrait mieux utiliser le moteur Full-text de MySQL.
Posté : 26 nov. 2006, 19:29
par albat
Pas de fontions dans les SELECT ! ça empêche l'utilisation des indices.
... des index ?
Et en plus, je le savais...
Shame on me ! 
Posté : 27 nov. 2006, 10:16
par charabia
Ah oué excellent l'astuce Hubert, je n'y aurais jamais pensé
merci à vous deux, je pense pouvoir mettre résolu !