2011-09-27 3 views
0

J'ai une base de données avec plusieurs tables. Par souci d'exemple, je vais le simplifier et essayer d'expliquer en détail.MySQL: SELECT DISTINCT à partir de plusieurs tables

Une table s'appelle Products, une autre appelée Brands, et la dernière s'appelle Categories.

Comme vous pouvez le deviner, chaque produit ne peut avoir qu'une seule catégorie assignée. En outre, chaque produit ne peut avoir qu'une seule marque attribuée. Ce sont les relations. Donc, sur une page j'ai des liens avec des marques comme paramètre que je passe à la page de détails où je liste tous les produits de marque spécifique. Sur cette page, j'ai également filtrer par catégories qui ne filtre que les produits de la marque sélectionnée par ce filtre.

E.g. Sony -> puis filtre appliqué à partir de la liste déroulante est dSLR -> Résultats des produits de la caméra Sony reflex dSLR. Ce que je voudrais, c'est que les catégories soient filtrées de sorte que si Brand n'a pas de catégorie spécifique, elle ne s'affiche même pas sur ce filtre déroulant.

E.g. Les catégories sont prédéfinies comme: dSLR, vidéo, téléphone portable, chaussures

Sony a des charges de produits, mais ne fait pas de chaussures, donc je voudrais l'avoir exclu de cette liste de filtres sur la page de détails.

vous espérez compris ce que je veux ici ...

Toute suggestion est plus que bienvenue :)

Répondre

1

Eh bien, vous devriez être en mesure de joindre les trois tables comme ceci:

SELECT DISTINCT c.category_id, c.category_name 
FROM products p 
JOIN categories c ON p.category_id = c.category_id 
JOIN brands b ON p.brand_id = b.brand_id 
WHERE b.brand_name='Sony'; 

puis afficher les produits comme ceci:

SELECT p.product_id, p.product_name 
FROM products p 
JOIN categories c ON p.category_id = c.category_id 
JOIN brands b ON p.brand_id = b.brand_id 
WHERE b.brand_name='Sony' AND c.category_id='1234'; 

Comme danishgoel l'a déjà noté, assurez-vous d'avoir les bons index sur vos tables, car c'est une requête assez coûteuse.

+0

Merci, ça devrait être le cas! – user966456

0

Une façon est de sélectionner la liste des catégories distinctes de produits d'une marque spécifique.

Vous pouvez le faire comme:

SELECT DISTINCT(cat_id) FROM PRODUCTS WHERE brand_id = 'sony' 

Maintenant vous avez seulement les catégories qui sont disponibles pour sony produits

La requête ci-dessus est peut-être un peu lent à exécuter sur chaque demande de page. Vous pouvez accélérer en créant un index sur brand_id, cat_id

+0

Peut-être que je n'étais pas assez clair. J'ai besoin de sql query qui peuplera cette boîte déroulante pour le filtre. Catégories-> cat_id, cat_name donc avec ce que je peupler la liste déroulante, et quand vous sélectionnez déroulant, vous obtenez filtré marque Sony par une catégorie ... – user966456

Questions connexes