2009-10-16 8 views
3

La table de catégorie ressemble un peu comme ci-dessous:Comment obtenir le compte de tous les produits d'une catégorie et de ses sous-catégories (et sous-sous-catégories)?

id -- name -- parent_id 
1 -- Men -- 0 
2 -- Women -- 0 
3 -- Shirts -- 1 
4 -- Half-sleeve -- 3 
5 -- Full-sleeve -- 3 

table Relation:

Product_id -- Category Id 
1   -- 2 
2   -- 2 
3   -- 4 .... 

je peux récupérer le nombre de produits dans une catégorie et ses sous-catégories immédiates avec facilité avec facilité. Mais s'il y a plus de 2 niveaux, les choses vont mal.

Donc, ma question est Comment puis-je obtenir le nombre de tous les produits dans les hommes et ses sous-catégories. Ou des chemises et ses sous-catégories?

Toutes les idées, merci.

MISE À JOUR:

Je sais qu'il est emboîtée Set modèle mais je ne suis pas en mesure de changer la structure de maintenant.

Répondre

3

Si c'est possible je voudrais vérifier Managing Hierarchical Data in MySQL.

Il est difficile d'avoir la tête au premier abord, mais cela facilite beaucoup les tâches de ce genre.

Si vous ne pouvez pas faire cela, vous devrez faire une fonction récursive, .: par exemple

$prods = 0; 
function getProdsInCat($cat) 
{ 
    global $prods; 

    $prods += mysql_result(mysql_query(SELECT COUNT(`Product_id`) FROM `prod_to_cat` WHERE `Category Id` = '".$cat."'),0); 


    $moreCats = mysql_query("SELECT `cat_id` FROM `cats` WHERE `parent_id` = '".$cat."'"); 
    while($cats = mysql_fetch_assoc($moreCats) 
    { 
     getProdsInCat($cats['cat_id']); 
    } 
} 
+0

Les données hiérarchiques rend ce facile, mais l'entretien des catégories pas si facile. J'ai utilisé hierarchical dans un autre projet cependant. – TigerTiger

+1

+1 Cet article était ma première pensée aussi! Mon conseil à l'OP est: redessiner les structures de données pour répondre aux exigences. – lexu

+0

Je viens aussi d'ajouter un exemple de fonction récursive qui trierait aussi vos problèmes avec la configuration actuelle – Lizard

1

En supposant que vous pouvez ajouter une colonne supplémentaire à la table des catégories.

Cette colonne aura le chemin vers la catégorie.

id -- name  -- parent_id path 
1 -- Men   -- 0   0/ 
2 -- Women  -- 0   0/ 
3 -- Shirts  -- 1   0/1 
4 -- Half-sleeve -- 3   0/1/3 
5 -- Full-sleeve -- 3   0/1/3 

De cette façon, trouver toutes les sous-catégories devient une requête:

SELECT id as CatId FROM categories WHERE path LIKE '0/1/%'; 

Et pour obtenir le nombre de tous les produits dans une catégorie et ses enfants est assez facile aussi:

SELECT count(p.id) as Total 
FROM products as p 
JOIN categories as c ON p.category_id = c.id 
WHERE c.path like '0/1/%'; 

Requête assez efficace.

Cet article fournit plus d'informations: More Trees & Hierarchies in SQL

+0

pas une mauvaise idée! – TigerTiger