recherche multicritères en une seule requête

Eléphant du PHP | 233 Messages

03 févr. 2019, 12:03

Bonjour à tous,

voilà, j'ai un formulaire de recherche qui comprend 7 champs
Titre, sexe, département, ville, catégorie, age mini et age maxi

est-il possible de faire une seule requête qui prendrait tous les cas de figure de l'utilisateur ? Si j'en crois mes recherches il faudrait que je fasse 128 autres requête comme celle-ci que j'ajoute avec $sql_add :

$sql_add = 'AND titre LIKE "%'.$_GET['search'].'%" or description LIKE "%'.$_GET['search'].'%" AND nom_cat LIKE "%'.$_GET['cat'].'%" AND  aa.id_dpt = "'.$_GET['id_departement'].'" AND aa.id_ville = "'.$_GET['id_ville'].'" AND aa.sexe = "'.$_GET['sexe'].'" AND aa.age >="'.$_GET['age_mini'].'" AND aa.age <="'.$_GET['age_maxi'].'"';
	}

La méthode que s'utilise est GET et je vous donne ma requête actuel :

$annonce = $bdd->query ("SELECT aa.sexe, aa.age, aa.titre, aa.description, aa.id_cat, ac.nom_cat, am.pseudo, aa.date_annonce, dpt.departement, v.ville, ti.id_annonce, ti.image_name FROM add_annonces as aa
				LEFT JOIN add_membres as am ON aa.id_membre=am.id
				LEFT JOIN add_cat as ac ON aa.id_cat=ac.id
				LEFT JOIN tbl_images as ti ON aa.id=ti.id_annonce 
				INNER JOIN ville as v ON aa.id_ville=v.id_ville
				INNER JOIN departement as dpt ON aa.id_dpt=dpt.id_departement
					WHERE  aa.valide = '1' $sql_add  GROUP BY ti.id_annonce ORDER BY date_annonce DESC LIMIT $limit_start, $pagination ");

Merci de vos suggestions

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

03 févr. 2019, 13:38

Si c'est pour un moteur de recherche tu risques d'être rapidement limité avec des LIKE, et il n'y aura pas de calcul de pertinence donc le résultat risque d'être déceptif.

MySQL a une fonctionnalité de recherche Fulltext qui permet justement d'améliorer la recherche.
Voici quelques pistes et exemples :
https://www.petefreitag.com/item/477.cfm
https://blog.axe-net.fr/recherche-perti ... -fulltext/

Si sur ton site la recherche est fondamentale, alors il faut que tu utilises un outil dédié à la recherche.
Les deux qui ont le vent en poupe à l'heure actuelle sont Elasticsearch (opensource) et Algolia (commercial mais beaucoup plus simple et pas très cher).
https://www.grafikart.fr/tutoriels/elastic-search-626
https://www.algolia.com/
Quand tout le reste a échoué, lisez le mode d'emploi...