2013-03-25 37 views
-1

我有这样树的遍历用于获取节点数组

 2 
/| \ 
    3 4 6 
    /\ 
    7 8 
     \ 
      9 

在db表一棵树看起来像这样

node_id parent_id 
     2  0 
     3  2 
     4  2 
     6  2 
     7  4 
     8  4 
     9  8 

的问题是,如果我通过4节点ID为函数,返回值应该是以7,8和9(表示4以下的所有节点)的数组(或逗号分隔)。我试过递归函数,但没有得到我真正期望的。请建议在PHP

+1

你试过了什么?附:欢迎来到Stack – George 2013-03-25 10:12:48

+0

我试过递归函数,但问题是我没有从什么地方返回数组。 – Shafeeque 2013-03-25 10:20:52

回答

2

你可以看一下这篇文章的一些可能的方式:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/(最初它是根据mysql.com出版,但后来删除)

为你的数据,你可以尝试类似以下内容:

CREATE TABLE `tree` (node_id INT NOT NULL, 
parent_id INT NOT NULL); 

INSERT INTO `tree`(node_id, parent_id) VALUES(2,0), 
(3,2), 
(4,2), 
(6,2), 
(7,4), 
(8,4), 
(9,8); 


SELECT t1.node_id AS lev1, t2.node_id AS lev2, t3.node_id AS lev3, t4.node_id AS lev4 
FROM tree AS t1 
LEFT JOIN tree AS t2 ON t2.parent_id = t1.node_id 
LEFT JOIN tree AS t3 ON t3.parent_id = t2.node_id 
LEFT JOIN tree AS t4 ON t4.parent_id = t3.node_id 
WHERE t1.node_id = 4; 
+0

感谢您的回复。答案不会导致我期望的结果。会有很多节点。手动LEFT JOIN不起作用。 – Shafeeque 2013-03-25 10:34:41

+0

那么你可以向下滚动我寄给你的文章并阅读关于嵌套集的文章?这意味着你应该改变你存储树的方式为嵌套集,然后你最终在一个基本查询中检索子树 – Alexey 2013-03-25 10:38:56

+0

我有另一种方法来解决这个问题。使用相同的表,在PHP中,我写了函数(递归),它将节点推送到一个数组。 – Shafeeque 2013-03-25 11:06:04