从数据库中获取多个级别的子项?

时间:2012-09-25 18:03:49

标签: php mysql

我的术语有点缺乏,所以我的问题的标题无疑是蹩脚的,但我会在下面解释我的意思。

我有一个类似于以下内容的MySQL表:

categories:

category_id | parent_id

     0            0
     1            0
     2            1
     3            1
     4            3

现在,我想要做的是输出类似这样的类别结构:

category structure:

0
1 -> 2
     3 -> 4

除了需要能够显示类别结构外,如果选择了一个类别,那么我想查找该类别和子类别中的所有文章(文章将是另一个表格,其中每篇文章都有一个parent_category_id喜欢它的类别。

我能想到这样做的唯一方法是:

  1. 获取所有类别,其中parent_id等于所查看类别的ID
  2. 遍历所有结果并重复第一步
  3. 继续这样做,直到检查完所有结果
  4. 有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

以有效的方式执行此操作的一种方法是使用嵌套集。 这有点棘手,更新起来有点复杂。

它的工作原理如下:

每个节点都有2个id和一个级别。节点ID之间的所有子节点ID。 例如:

category_id | parent_id | low_id |  high_id 
 0            0          1          2
 1            0          3          10
 2            1          4          5
 3            1          6          9
 4            3          7          8

现在你可以说“给我所有类别1的子节点”:

select *
from categories
where low_id between 3 /* (low_id node1) */ and 10 /* (high_id node 1) */

但是如果你必须插入一个节点,你需要一个算法来将其他节点移动到正确的位置。 也可以存储节点的级别,因此您不必查找id / parent_id关系,只需按low_id排序并使用级别作为指示符。

如果你使用php作为编程语言,有一个doctrine2插件来处理嵌套集。

编辑:我认为这是一个很好的开始:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/