2

类别表如下所示:

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 个级别,事情就会变得一团糟。

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

任何想法,谢谢。

更新:

我知道有嵌套集模型,但我现在无法将结构更改为那个。

4

2 回答 2

3

如果可能的话,我会查看在 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']);
    }
}
于 2009-10-16T09:02:47.340 回答
3

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

所述列将具有该类别的路径。

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

非常有效的查询。

本文提供了更多信息:SQL 中的更多树和层次结构

于 2009-10-16T09:50:57.670 回答