Requête avec LIKE mais approximatif

Avatar du membre
ViPHP
ViPHP | 3008 Messages

26 nov. 2006, 12:19

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 !

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

26 nov. 2006, 12:33

Pour commencer, voici une astuce pour résoudre les problèmes de casse (capitales et minuscules).
:idea: Tu passes tout en capitales :
$req = "SELECT champs FROM table WHERE strtoupper(ville) = strtoupper(".$ville.")";
Bon, maintenant, les tirets et autres amuseries... :ordi:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

26 nov. 2006, 12:38

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.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

26 nov. 2006, 12:44

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.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

26 nov. 2006, 13:02

Oki dac je me penche sur cette solution ;)

Merci !

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

26 nov. 2006, 13:07

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...

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

26 nov. 2006, 13:08

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,...

Avatar du membre
ViPHP
ViPHP | 3008 Messages

26 nov. 2006, 13:12

d'accord ;)

Je verrais avec les regex pour supprimer tous les accents avant de faire la comparaison.

Merci de ton aide ;)

Avatar du membre
ViPHP
ViPHP | 3008 Messages

26 nov. 2006, 14:06

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.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

26 nov. 2006, 19:21

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.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

26 nov. 2006, 19:29

Pas de fontions dans les SELECT ! ça empêche l'utilisation des indices.
... des index ?

Et en plus, je le savais... Shame on me ! :oops:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

27 nov. 2006, 10:16

Ah oué excellent l'astuce Hubert, je n'y aurais jamais pensé ;)

merci à vous deux, je pense pouvoir mettre résolu !