Reduire et optimiser une requete sql

WRInaute impliqué
Bonjour,

je souhaite réduire et optimiser si possible cette requete sql :

Code:
"SELECT name_real, zip FROM cities WHERE name_real LIKE (:keyword_1) OR name_real LIKE (:keyword_2) OR name_slug LIKE (:keyword_1) OR name_simple LIKE (:keyword_2) OR zip LIKE (:keyword_1) ORDER BY name_real ASC LIMIT 0, 10"

Elle possède une succession de OR et je souhaite savoir si cela est possible de tout combiner afin de réduire le temps d’exécution.

Merci
 
WRInaute accro
Je ne vois pas trop comment réduire cette taille.

NB: LIKE pour une recherche c'est un peu cheap, avec ton exemple d'hier: Pont l'Abbé, si on cherche "pont abbé" ça trouvera pas => Cfr. recherche full text.
 
WRInaute occasionnel
Ouais, faut éviter de faire ça, une requête avec 5 LIKE c'est assez monstrueux. Faut procéder autrement.
 
WRInaute impliqué
Si on reprends l'exemple de Pont-l'Abbé (nom réel), cela peut d'écrire pour une personne de plusieurs manière :

pont-labbé
pont labbé
pont l'abbé

C'est comme La Grande-Motte (nom réel)

Cela peut s'écrire de plusieurs manière :

la grande motte
la-grande-motte
grande motte

Alors comme sortir le resultat à coup sur sachant que dans ma table j'ai 3 champs exploitable (nom réel, nom slug et nom simple) ?

Pour Pont-l'Abbé :

Nom réel : Pont-l'Abbé
Nom slug : pont-l-abbe
Nom simple: pont l abbe

En dehors des like j'ai du mal à trouver la solution
 
WRInaute discret
Il faut que tu fasse des recherches avec LIKE % plutôt que LIKE seul.
Par exemple LIKE %grande-motte% trouve la-grande-motte

Si tu cherche d'autres solution pour les recherches textuelles : http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

A voir aussi s'il ne faudrait pas supprimer les articles du champ slug :
Le nom d'affichage : Pont l'Abbé / La Grande-Motte
Le nom de recherche : pont-abbe / grande-motte

Ça te permettrait de trouver Pont l'Abbé que la recherche soit Pont l'abbé, Pont abbé, l'abbé, etc
 
WRInaute impliqué
Je viens de tester, ca fonctionne parfaitement pour le nom d'une ville non composé comme montpellier, mais pour un nom composé comme pont l'abbé et la grande motte (toujours les meme exemples) ca me sort une liste de 50 villes, donc celles en question.

Code:
SELECT * FROM cities WHERE MATCH (name_real, name_slug) AGAINST ('".$_POST['keyword']."' IN BOOLEAN MODE);
 
WRInaute impliqué
J'ai fais ceci pour qu'il cherche chaque composition du nom de la ville, du genre pont l'abbé se transforme en pont +l +abbe

Vous en pensez quoi?

Code:
$keyword = str_replace("-", " +", slug($_POST['keyword']));

$sql = "SELECT * FROM cities WHERE MATCH (name_real, name_slug) AGAINST ('+".$keyword."' IN BOOLEAN MODE);";
 
WRInaute discret
Ça a l'air pas mal vu comme ça, quels sont les résultats ?

Si tu ne met pas * à la fin des tes mots clés, la recherche sera stricte, c'est voulu ?
SELECT * FROM cities WHERE MATCH (name_real, name_slug) AGAINST ('+pari' IN BOOLEAN MODE)
Ne trouvera pas paris

Il semblerait que, par défaut, l'indexation minimale est de 4 caractères :
http://dev.mysql.com/doc/refman/5.7/en/fulltext-fine-tuning.html
Vérifies ta configuration, sinon les habitants des Gap et de Die ne trouveront jamais rien ;-)
 
Discussions similaires
Haut