计算一个类别中的所有子类别

时间:2012-03-14 22:27:03

标签: php mysql

我的数据库包含以下列:

id, parent, name, description

id已设置为自动启用。我想得到所有子类别的总数,这些子类别是父类别(它的父类设置为0)我也希望这是递归的。这样做的最佳方法是什么?

我已经编写了以下函数,但目前无法测试它:

function CountDeepSubCategories($parentID, $max = 0)
{
    global $_DB;

    $all = $all + $max;

    $q = $_DB->Query("SELECT id FROM category_cats WHERE parent = $parentID");
    $id = $_DB->GetResultValue($q, 0, 'id');

    $num = $_DB->GetResultNumber($q);       

    for($i = 0; $i < $num; $i++)
    {
         CountDeepSubCategories($id, $all);
    }

    return $all;        
}

4 个答案:

答案 0 :(得分:2)

http://www.slideshare.net/billkarwin/sql-antipatterns-strike-back查看Bill Karwin的演示文稿(您的问题在第48页描述)。他解释了你的解决方案的优缺点,并提供了另外三个,并将它们相互比较。

答案 1 :(得分:1)

每个类别都有父母吗?如果您可以“从category_cats中选择计数(*)”:)

好的,对于您发布的第二条评论,为什么不添加像这样的内部查询:

select cct.id,
    (select count(1) from category_cats where parent=cct.id) as subcount
from category_cats cct

我没有对它进行测试,但它应该有效。

答案 2 :(得分:1)

递归似乎是一个优雅的解决方案,但它远远不是最佳表现者。您可以考虑将类别树存储为Nested Set,这在插入新记录时是一个相当大的开销,但它提供了使用一个简单的SQL查询获取整个树的优势。

答案 3 :(得分:0)

最快(在SQL中),但绝对不是最简单的方法,是使用预先排序的树结构:

http://www.sitepoint.com/hierarchical-data-database-2/