2016-11-17 78 views
-1

我有这样的一个表:如何获得子树表在PHP

id title  parent_id 
1  A   0 
2  B   0 
3  C   1 
4  F   3 
5  O   3 
6  D   2 
7  J   6 
8  T   2 
9  P   8 


A 
    C 
     F 
     O 

B 
    D 
    J 
    T 
    P 

现在,如果我给2,这个功能应该返回:

6 
8 
7 
9 

而且,如果我给3它函数返回:

4 
5 
  • 我不想只是叶子节点!
  • 我认为有一个SQL查询。
+1

有类似的问题,并很好的答案在这里:http://stackoverflow.com/questions/2915748/convert-a-series-of-parent-child-relationships-into-一个分层树。 然后这可能是一个重复的问题。 – niklaz

回答

0

只是SQL:

select id, 
     title, 
     parent_id 
from (select * from products 
     order by parent_id, id) base, 
     (select @pv := '3') tmp 
where find_in_set(parent_id, @pv) > 0 
and  @pv := concat(@pv, ',', id) 
0

我认为你需要与自己连接表。我没有自己尝试,但它是像下面的代码

SELECT a.id, a.title 
FROM tbl AS a 
WHERE a.id = :id 

UNION 

SELECT b.id, b.title 
FROM tbl AS a 
INNER JOIN tbl AS b ON a.id = b.parent_id 
WHERE a.id = :id 

UNION 

SELECT c.id, c.title 
FROM tbl AS a 
INNER JOIN tbl AS b ON a.id = b.parent_id 
INNER JOIN tbl AS c ON b.id = c.parent_id 
WHERE a.id = :id 

UNION 

SELECT d.id, d.title 
FROM tbl AS a 
INNER JOIN tbl AS b ON a.id = b.parent_id 
INNER JOIN tbl AS c ON b.id = c.parent_id 
INNER JOIN tbl AS d ON c.id = d.parent_id 
WHERE a.id = :id 

... 

继续添加查询,直到你需要的深度数。还有其他方法,例如使用存储过程。

+0

我认为这不是一个好主意。因为如果我想获取深度50?和'深度'不可用! –

+0

我相信如果没有父子关系内连接只是返回没有结果集。然而,越深入越需要更多的资源 –