2009-11-19 3 views
4

J'ai un modèle de jeu imbriqué qui fonctionne pour mon site avec des éléments dans les sous-catégories et ainsi de suite. Cela fonctionne bien, sauf pour un problème que je ne peux pas contourner.Modèle de jeu imbriqué, compte les éléments dans les catégories

+---------+-----------------------------+ 
| item_id | item_name     | 
+---------+-----------------------------+ 
|  1 | Laptop      | 
|  2 | iPod Classic 80GB   | 
|  3 | iPod Classic 160GB   | 
+---------+-----------------------------+ 
+---------+-------------+ 
| item_id | category_id | 
+---------+-------------+ 
|  1 |   4 | 
|  2 |   2 | 
|  3 |   2 | 
+---------+-------------+ 
+-------------+--------------------+-----+-----+ 
| category_id | name    | lft | rgt | 
+-------------+--------------------+-----+-----+ 
|   1 | iPod    | 1 | 6 | 
|   2 | Classic   | 2 | 3 | 
|   3 | Nano    | 4 | 5 | 
|   4 | Computers   | 7 | 8 | 
+-------------+--------------------+-----+-----+ 

En utilisant la requête suivante:

SELECT parent.name, COUNT(product.item_id) 
    FROM Category AS node, Category AS parent, Item_Category AS product 
    WHERE node.lft BETWEEN parent.lft AND parent.rgt 
     AND node.category_id = product.category_id 
    GROUP BY parent.name 
    ORDER BY node.lft; 

donne la sortie suivante:

+-----------------+------------------------+ 
| name   | COUNT(product.item_id) | 
+-----------------+------------------------+ 
| iPod   |      2 | 
| Classic   |      2 | 
| Computers  |      1 | 
+-----------------+------------------------+ 

En d'autres termes, tous les domaines qui ne sont pas produits en eux ne seront pas affichés . Maintenant, au problème, je veux les montrer avec le résultat COUNT() = 0. Comment ma requête chercherait-elle à rendre cela possible? :)

Répondre

3

sonne comme une tâche LEFT OUTER JOIN pour moi, comme si:

SELECT parent.name, COUNT(product.item_id), 
     (select count(*) from Category parent2 
     where parent.lft > parent2.lft 
      and parent.rgt < parent2.rgt) as depth 
    FROM Category parent 
    LEFT OUTER JOIN Category node 
    ON node.lft BETWEEN parent.lft AND parent.rgt 
    LEFT OUTER JOIN Item_Category product 
    ON node.category_id = product.category_id 
GROUP BY parent.name 
ORDER by node.lft 

De ce fait, assurez-vous que toutes les catégories sont représentées. Notez que je ne suis pas sûr à 100%.

EDIT: Ajout d'un sous-select pour la profondeur, faites un essai.

EDIT: Enlevée par des virgules

+0

travaillé comme un charme :) – xintron

+0

heureux d'apprendre que. –

+0

Est-il possible de compter la profondeur des sous-catégories en même temps en utilisant cette requête? – xintron

Questions connexes