Php 用于选择树的所有分支的查询

Php 用于选择树的所有分支的查询,php,mysql,Php,Mysql,我有一张这样的分类表 id | title | parent_id ---|-------|------------ 1 | cat1 | null 2 | cat2 | null 3 | cat3 | 1 4 | cat4 | 1 5 | cat5 | 3 6 | cat6 | 5 7 | cat7 | 6 8 | cat8 | 7 我想知道我如何能有主要类别及其分支和一列,让我计数每棵树的分支 例如,主类别cat1的类似内容: cat1 =&

我有一张这样的分类表

id | title | parent_id
---|-------|------------
1  | cat1  |  null
2  | cat2  |  null
3  | cat3  |  1
4  | cat4  |  1
5  | cat5  |  3
6  | cat6  |  5
7  | cat7  |  6
8  | cat8  |  7
我想知道我如何能有主要类别及其分支和一列,让我计数每棵树的分支 例如,主类别cat1的类似内容:

cat1 => cat3 => cat5 => cat6 => cat7 => cat8

谢谢

以数组的形式从数据库中获取所有条目

select * from categories;
现在$children[$category_id]数组中的每个类别都有子类别

为每一个孩子做父母

打印从任何子级到根的遍历

$id = `any id`;

while(isset($id)){
   echo $name[$id] . " => ";
   $id = isset(parent[$id] ? parent[$id] : null); 
}
获取任何节点的子节点计数

echo sizeof($children[$category_id]);
现在,当涉及到从父节点到子节点的遍历时,可以有许多选项,因为一个节点可以有多个子节点

我正在编写选择随机子对象并进行下一级遍历的代码

$id = `any id`;

while(isset($id)){
   echo $name[$id] . " => ";
   if(isset($children[$id])){
     $idx = array_rand($children[$id], 1);
     $id = $children[$idx];
   }
   else{
      // This means you've reached the leaf node.
      $id = null;
   }
}


您使用的是哪个版本的MySQL?我建议添加一列“path”,您可以使用祖先ID填充该列,这些ID由一些分隔符分隔:“/1/3/5/6/7/8/”。它使您在编写和维护方面花费了更多的复杂性,但您获得了简单而强大的查询。谢谢亲爱的朋友,我不确定这种方式的性能速度。您认为它的速度是否与我们需要的大型电子商务网站的速度一样快?从数据库查询和从PHP运行这些代码的速度足够快吗?是的,足够快。我的意思是,在时间复杂度方面,第一个循环是O(n),因为我们在使用map(PHP中的数组)。这只需要做一次。获取遍历的另一个循环在O(x)中运行,其中x是整个遍历的长度(从叶到根)(在最坏的情况下可以是n)。现在这个循环利用了先前构建的地图。因此,您只需构建一次映射,并以一种非常有效的方式(按照遍历长度的顺序)计算任意数量的遍历。是的,显然可能有一个数据库查询可以处理这种动态级别的查询。我不知道,但可能还有其他人知道:)所以,是的,这是我的答案。非常感谢你
$id = `any id`;

while(isset($id)){
   echo $name[$id] . " => ";
   if(isset($children[$id])){
     $idx = array_rand($children[$id], 1);
     $id = $children[$idx];
   }
   else{
      // This means you've reached the leaf node.
      $id = null;
   }
}