3 votes

Compter les enregistrements des critères de recherche en fonction de la recherche effectuée par l'utilisateur (MYSQL PHP)

J'ai un formulaire de recherche qui permet de rechercher des propriétés pour les vacances dans un pays spécifique en fonction de leur disponibilité à une date spécifique. La section de recherche comporte 2 sections : "recherche de base" et "recherche avancée".

La recherche de base contient une liste déroulante de pays et un champ de date. Dans la recherche avancée, nous avons plusieurs filtres pour les hôtels comme "Chambres" (1 chambre, 2 chambres, etc.) et ensuite le type de propriété (appartement, villa, etc.).

Je souhaite afficher les options de filtre de recherche avec un nombre tel que "1 chambre (23 biens)" et la même chose pour les autres options de filtre de recherche.

J'utilise php/mysql pour créer cette application, donc ce qui me vient en premier à l'esprit est d'exécuter des requêtes multiples pour tous les filtres de recherche et de récupérer le résultat COUNT de mysql et de l'afficher. J'ai environ 10-12 filtres différents sur ma page. Je dois également afficher le nombre d'enregistrements de manière dynamique en fonction de toutes les options de recherche (basique et avancée) sélectionnées.

L'exécution de plusieurs requêtes sur la page la chargera indéfiniment et le contenu ne s'affichera pas en raison de la charge de requêtes multiples. Existe-t-il un moyen plus rapide et plus efficace de faire cela ?

Merci de votre aide !

1voto

Simon at mso.net Points 4981

J'ai déjà essayé de le faire, et cela peut devenir très lent en fonction du nombre de filtres que vous autorisez et du nombre d'hôtels que vous répertoriez, sans parler de la façon dont vous gérez les hôtels en double.

En fin de compte, vous n'aurez que très peu d'options de filtrage

  • Type de propriété : normaliser dans un tableau séparé
  • Chambres : stocker cette valeur sous la forme d'un tinyint ou d'un smallint (non signé), je ne peux pas imaginer qu'il y ait des propriétés avec plus de 255 chambres, et certainement pas avec plus de 65k.
  • Emplacement : normaliser ces données dans un tableau séparé, idéalement sous forme d'arbre afin de garantir que les relations sont notées.
  • Classement par étoiles : il peut être stocké sous la forme d'un minuscule non signé.

Le problème est que si quelqu'un applique un filtre pour 3 chambres à coucher, vous devriez toujours obtenir des valeurs pour 2 chambres à coucher, 1 chambre à coucher, puisque le changement du filtre donnera des résultats.

En fin de compte, j'ai résolu ce problème en utilisant une très grande table de mémoire, une certaine logique pour construire des instructions WHERE et JOIN, et une requête individuelle comptant les enregistrements au sein d'un groupe défini. Il s'agissait cependant d'un travail similaire à celui des utilisateurs pour les résultats de recherche de vacances, et les données étaient donc considérées comme entièrement transitoires. Pour vos besoins, une table de mémoire beaucoup plus petite sera probablement acceptable, mais le principe est similaire.

1voto

msgmash.com Points 997

Utilisez la clause GROUP BY en conjonction avec COUNT dans votre instruction SELECT. Par exemple, j'ai défini une petite table de test telle que

create table rooms (
rooms INT NOT NULL,
name VARCHAR(10)
)

Il a ensuite exécuté la requête

SELECT rooms,COUNT(*) FROM rooms GROUP BY rooms;

Vous obtenez ainsi un résultat avec chaque nombre de pièces et le nombre d'entrées correspondant à cette valeur.

1voto

Damian W Points 85

Ce que vous essayez de réaliser s'appelle recherche à facettes .

Ce problème n'est pas adapté à une base de données relationnelle comme MySQL.

Vous pouvez utiliser ElasticSearch o AWS CloudSearch et leur caractéristiques des facettes .

N'oubliez pas qu'il s'agit de serveurs de recherche qui ne remplacent pas votre base de données principale. Ils effectuent uniquement des opérations de recherche qui renvoient les identifiants correspondant aux enregistrements réels stockés dans votre base de données. Vous avez toujours besoin de MySQL (ou MongoDB, etc.).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X