如何使用php和我的sql检索根节点的所有节点

时间:2013-03-17 18:02:45

标签: php mysql

我有这样的结构:

  • A(根节点)有两个子B(左子)和C(右子)。
  • 同样,B还有两个节点D(左子节点)和E(右子节点)。
  • 同样,C还有两个节点F(左子节点),G(右子节点),就像这样一个节点。

我的疑问是:

  • 如果我输入A(根节点),它将显示A下的所有子节点,输出就像这个BCDEFG
  • 同样,如果我输入B,那么输出就会像DE一样。

我的第二个疑问是,如果我输入A,那么它将显示他的左孩子和右孩子。

我的表结构是这样的

id     c_n      p_n 

1       B        A

2       C        A

3       D        B

4       E        B
像这样。

此处有三个字段,一个是idc_np_n

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

根据您当前的架构,以下内容将根据您的请求从逗号分隔的字符串中提取1或2级层次结构(有条件地)的子节点

SELECT 
    CONCAT(
        GROUP_CONCAT(t1.c_n), 
        IF(COUNT(t2.c_n), ',', ''), 
        GROUP_CONCAT(t2.c_n)
    ) AS nodex
FROM table_name AS t1
LEFT JOIN table_name AS t2 ON t1.c_n = t2.p_n
WHERE t1.p_n = 'A'
GROUP BY t1.p_n

但是,为了简化和选择速度,您应该考虑切换到nested set模型。

答案 1 :(得分:0)

您应该引入另外两个字段lftrgt,并使用嵌套树模型为您的表使用这两列。

解释此设置和使用的示例文档是here

这将使您能够更有效地进行这类查询。

例如,要获得整个树,您只需要查询lft大于根的所有节点,以及rgt更小的节点。