2012-09-25 118 views
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等于通过所有的结果并重复步骤被视为
  2. 环类的id一个
  3. 只是一直这样做,直到所有的结果都被检查

有没有更好的方法来做到这一点?

回答

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/

相关问题