2009-10-23 8 views
1

Est-ce que quelqu'un a une idée sur la façon dont vous pouvez créer une requête de filtrage de produit (ou requêtes) qui va émuler les résultats sur cette page?Solution de requête Tricky

http://www.emag.ro/notebook_laptop

Explication

Si vous appuyez sur HP comme une marque, la page va vous montrer tous les produits HP, et le reste des filtres disponibles sont recueillies à partir de ce résultat de la requête. Fine et dandy jusqu'à maintenant, je me suis léché sans aucun problème.

Appuyez sur 4 Go Ram, et bien sûr, vous verrez tous les produits HP qui ont cette propriété/fonctionnalité. Encore une fois bien et dandy, n'a eu aucun problème jusqu'à ici. Mais si vous regardez de plus près, vous verrez que les caractéristiques de la marque montrent maintenant, disons, Acer, avoir quelques produits avec la fonction 4Go, et peut-être plus après Acer, et la case n'est pas encore pressée.

La seule idée qui vient à l'esprit est de faire autant de requêtes à la base de données pour obtenir ces autres possibilités. Après avoir vérifié la 3ème option possible (disons Taille d'affichage), les choses commencent à se compliquer encore plus.

Je suppose que ma question est: Est-ce que quelqu'un a une idée sur la façon de faire ce sans taxer le serveur avec des tonnes de requêtes?

Merci beaucoup d'avoir lu jusqu'ici, j'espère avoir été clair dans toute cette petite histoire.

Répondre

0

Ce ne sont pas vraiment des "tonnes" de requêtes, c'est une requête par type d'attribut (marque, RAM, disque dur). Disons que vous avez sélectionné HP, 4 Go de RAM et 250 Go de disque. Maintenant, pour chaque type d'attribut, sélectionnez les produits en fonction du filtre, à l'exception de pour le type actuel, et groupez-les en fonction des résultats par type actuel. Dans un modèle simpliste, les requêtes pourraient ressembler à ceci:

SELECT brand, count(*) FROM products WHERE ram='4BG' AND disk='250GB' GROUP BY brand 
SELECT ram, count(*) FROM products WHERE brand='HP' AND disk='250GB' GROUP BY ram 
SELECT disk, count(*) FROM products WHERE brand='HP' AND ram='4BG' GROUP BY disk 
SELECT cpu, count(*) FROM products WHERE brand='HP' AND ram='4BG' AND disk='250BG' GROUP BY cpu 
... 

Vous devriez avoir des index sur les colonnes, que toutes les requêtes ne fait pas une analyse séquentielle sur la table. Bien sûr, il existe des combinaisons "populaires" et vous devrez probablement afficher les mêmes numéros sur plusieurs pages lorsque l'utilisateur triera/naviguera dans la liste. Vous pouvez donc mettre en cache les numéros et invalider le cache lors de la mise à jour/insertion/suppression .

+0

Je pense que cela peut fonctionner ... Je vais essayer et revenir avec les résultats :) Merci beaucoup! –

+0

Utilisez COUNT (1) au lieu de COUNT (*). C'est plus rapide car il n'a pas besoin de parcourir toutes les colonnes et de voir si elles sont NULL. – Felix

+0

@Fixix: C'est faux, 'count (*)' fait exactement la même chose que 'count (1)' - il compte les lignes. Il vérifiera si elles sont 'NULL' seulement si vous utilisez' count (colonne) '. –

1

Jetez un oeil à sql

UNION 
syntaxe

.

"UNION est utilisé pour combiner le résultat de plusieurs instructions SELECT dans un seul jeu de résultats."

+0

Merci pour l'idée :) Jamais utilisé UNION mais il semble que cela pourrait aider dans certains cas! –

0

Il se peut qu'il existe des moyens sophistiqués de déterminer une certaine distance calculée d'un résultat à partir de vos critères, mais c'est peut-être aussi simple que d'utiliser un OR dans la requête plutôt qu'un AND.

+0

Désolé, j'ai oublié de mentionner que j'ai utilisé OU entre les filtres dans le même groupe, et ET entre les groupes. –

Questions connexes