2

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

我有一个类似于以下内容的 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 回答 1

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 作为编程语言,则有一个学说 2 插件来处理嵌套集。

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

于 2012-09-25T18:46:04.330 回答