我的数据库包含以下列:
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;
}
答案 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中),但绝对不是最简单的方法,是使用预先排序的树结构: