2013-02-14 4 views
0

Le code SQL suivant fonctionne correctement, mais je ne peux pas sélectionner/filtrer la catégorie. Apporte toutes les catégories.Filtrer par sous-noeud avec le nombre de produits

À titre d'exemple,

Cars (20) (root) 
---> Blue cars (12) 
----------> Ford (2) 
----------> Bmw (9) 
----------> Dodge (1) 
---> Red cars (9) 
----------> Xxxx (9) 
---> Black cars (1) 
----------> Yy (1) 

Comment puis-je sélectionner uniquement la catégorie de la voiture bleue. (avec sous-noeuds)

Comment est-ce que je peux changer le code de SQL pour ceci peut être fait?

Je souhaite que le résultat soit le suivant. (Si je choisis la catégorie de voiture bleue)

---> blue cars (12) 
----------> ford (2) 
----------> bmw (9) 
----------> dodge (1) 

Ce code sql ...

SELECT 
parent.cid, 
parent.title, 
(SELECT COUNT(parent2.cid) FROM categories AS parent2 WHERE parent.lft > parent2.lft AND parent.rgt < parent2.rgt) AS depth, 
COUNT(products.cat_id) AS total 

FROM categories AS node, 
categories AS parent, 
products 

WHERE 

node.lft BETWEEN parent.lft AND parent.rgt 

AND node.cid = products.cat_id 

GROUP BY parent.cid having depth <= 5 
ORDER BY parent.lft 
+0

Comment stockez-vous votre heirachy? - voir cette question pour vos options http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database –

+0

Modèle de jeu imbriqué –

+0

Je pense que tout vous devez faire est d'ajouter 'AND node.cid =' (quel que soit le cid est l'ID pour les voitures bleues) – cha

Répondre

0

Je pense que vous avez Overthinking cela - obtenir le sous-arbre est sur le fonctionnement simplist pour les ensembles imbriqués

SELECT * 
FROM categories 
WHERE lft BETWEEN bluecarleftvalue AND bluecarrightvalue 
ORDER BY lft ASC 
+0

essentiellement oui. mais j'ai besoin de compter les produits. –

+0

Quel est le lien entre les catégories et les produits? –

Questions connexes