代码之家  ›  专栏  ›  技术社区  ›  TigerTiger

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

  •  2
  • TigerTiger  · 技术社区  · 15 年前

    类别表如下所示:

    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级,事情就会变得混乱。

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

    有什么想法,谢谢。

    更新:

    我知道有嵌套集模型,但我现在还不能将结构更改为嵌套集模型。

    2 回复  |  直到 13 年前
        1
  •  3
  •   PaÅ­lo Ebermann    13 年前

    如果可能的话,我会结账离开 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']);
        }
    }
    
        2
  •  1
  •   elviejo79    15 年前

    假设您可以向Categories表中添加额外的列。

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

    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