如何获得某个类别及其子类别(和子子类别)中所有产品的数量?

问题描述:

类别表看起来像如下有点:如何获得某个类别及其子类别(和子子类别)中所有产品的数量?

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

关系表:

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

我可以检索的产品在任何一个类别,它的直接子类轻松自如的数量。但是如果有超过2个级别的东西会变得混乱。

所以我的问题是如何获得男性及其子类别中所有产品的数量。或衬衫及其子类?

任何想法,谢谢。

UPDATE:

我知道有嵌套集模型,但我不是在现在的位置来改变结构上。

如果有可能我会检查出Managing Hierarchical Data in MySQL

一开始很难让你头脑发热,但它使得这样的任务更容易。

如果你不能做到这一点,你必须做一个递归函数,例如:

$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

分层数据使这很容易,但类别不是那么容易的维护。我已经在另一个项目中使用了分层结构。 – TigerTiger 2009-10-16 09:05:58

+1

+1那篇文章是我的第一个念头!我对OP的建议是:重新设计数据结构以满足要求。 – lexu 2009-10-16 09:07:00

+0

我也刚刚添加了一个递归函数的例子,它也将排序问题与当前设置 – Lizard 2009-10-16 09:11:10

假设你可以添加一个额外的列的类别表。

表示该列将具有该类别的路径。

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 

这种方式找到所有子类别变成一个查询:

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

而获得的一个类别中的所有产品和儿童的数量是很容易的事:

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/%'; 

相当有效的查询。

这篇文章提供了更多信息:More Trees & Hierarchies in SQL

+0

不是一个坏主意! – TigerTiger 2009-10-16 11:59:14