2010-12-15 27 views
1

Disons que nous avons cette tablesObtenez le décompte du nombre de postes dans les enfants des catégories d'une catégorie donnée dans MySQL

t1 
-------------------------------- 
category_id | name | lft | rgt 
-------------------------------- 
1    cat1 1  8 
2    cat2 2  3 
3    cat3 4  7 
4    cat4 5  6 

t2 
------------------------------- 
item_id | category_id 
-------------------------------- 
1   1 
2   2 
3   3 
4   4 

Est-il possible de MySQL pour obtenir le nombre d'éléments d'une catégorie a (y compris ces articles qui appartiennent à ses enfants)? Quelque chose comme ça ...

------------------------------- 
category_id | item_count 
-------------------------------- 
1    4 
2    1 
3    2 
4    1 

J'ai des problèmes de connexion de la requête qui obtient les category_ids et la requête qui obtient le nombre des catégories d'enfants.

SELECT category_id FROM t1 WHERE <some conditions here> 

SELECT 
    COUNT(*) AS item_count, 
    category_id 
FROM 
    t2 
WHERE 
    t2.category_id IN 
    (
SELECT 
     node.category_id 
FROM 
    t1 AS node, 
    t1 AS parent 
    WHERE 
    node.lft BETWEEN parent.lft AND parent.rgt 
    AND parent.category_id = 5 <---- How do I pass the category ids of the first query 
             here? 
)   
+0

Mes requêtes retournent des résultats bizarres - ne devrait pas category_id 2 un itemcount de 2? – Pimgd

+0

Solution mise à jour - espérons que cela fonctionne! – Pimgd

Répondre

1
SELECT a.category_id, COUNT(a.item_id) as itemcount 
FROM itemTable a 
GROUP BY a.category_id; 

Tout ce que vous devez faire est de savoir comment vous pouvez ajouter ceux qui n'ont pas tous les articles à ce sujet. Bon, alors le problème est d'obtenir une valeur dans un sous-menu ... Je ne suis pas un expert en SQL, mais je suggère de créer une vue.

SELECT category_id FROM t1 WHERE <some conditions here> 
CREATE VIEW temp AS 
SELECT 
    node.category_id as nc_id, parent.category_id as pc_id 
FROM 
    t1 AS node, 
    t1 AS parent 
WHERE 
    node.lft BETWEEN parent.lft AND parent.rgt; 

VIEW temp 
nc_id | pc_id 
1 1 
2 1 
3 1 
4 1 
2 2 
3 2 
4 3 


t2 
itemid| catid 
1 1 
2 2 
3 3 
4 4 

CREATE VIEW temp2 AS 
    SELECT 
    * 
    FROM 
    t2, temp 
    WHERE t2.category_id = temp.nc_id OR t2.category_id = temp.pc_id 

cat_id| itemid |nc_id | pc_id 
1 1 1 1 
1 1 2 1 
1 1 3 1 
1 1 4 1 
2 2 2 1 
2 2 2 2 
2 2 3 2 
3 3 3 1 
3 3 3 2 
3 3 4 3 
4 4 4 1 
4 4 4 3 

CREATE VIEW temp3 AS 
SELECT cat_id, itemid, nc_id, pc_id 
FROM temp2 
GROUP BY item_id, nc_id; 

temp3: 
cat_id| itemid |nc_id | pc_id 
1 1 1 1 
1 1 2 1 
1 1 3 1 
1 1 4 1 
2 2 2 1 
2 2 3 2 
3 3 3 1 
3 3 4 3 
4 4 4 1 

SELECT count(itemid) AS itemcount, cat_id 
FROM temp3 
GROUP BY cat_id; 

itemcount  |cat_id 
4  1 
2  2 
2  3 
1  4 

DROP VIEW temp3; 
DROP VIEW temp2; 
DROP VIEW temp; 

Et conclut ainsi ma réponse. J'espère que cela fonctionne, et j'espère aussi que vous pouvez nettoyer mon gâchis (en termes d'optimisation de ce que j'ai écrit)

+0

J'ai utilisé un exemple simple pour la première requête. Mais il a des conditions WHERE dans la réalité. – arvinsim