2011-10-05 100 views
3

我有使用修改的预定义树遍历算法保存的分级有序数据。修改的预定义树遍历:选择节点1级深

这里的表内容:

id lft rgt name 
1 1 10 topnode 
2 2 3 level1 
3 4 7 level1 
4 5 6 level2 
5 8 9 level1 

可视化:

Scheme

我要的是选择特定的节点就在的childNodes(所以不是的childNodes的的childNodes)。让我们说'topnode'。我试图修复一个查询,但我似乎无法解决这个问题。

搜索互联网给我带来一段时间,例如:我可以计算每个节点的深度,但我似乎无法选择它。

这个查询

SELECT node.*, (COUNT(parent.id) - 1) AS depth 
FROM tree AS node 
CROSS JOIN tree AS parent 
WHERE (node.lft BETWEEN parent.lft AND parent.rgt) 
GROUP BY node.id 
ORDER BY node.lft 

显示每个节点的深度:

id lft rgt name  depth 
1 1 10 topnode 0 
2 2 3 level1 1 
3 4 7 level1 1 
4 5 6 level2 2 
5 8 9 level1 1 

这是伟大的,但我不能用柱深为条件!

回答

9

我想这应该做的伎俩

SELECT node.*, (COUNT(parent.id) - 1) AS depth 
FROM tree AS node 
CROSS JOIN tree AS parent 
WHERE (node.lft BETWEEN parent.lft AND parent.rgt) 
GROUP BY node.id 
HAVING depth = {{ENTER YOUR REQUIRED DEPTH HERE}} 
ORDER BY node.lft 

希望帮助

+3

+1,因为它的工作原理,但它与我的35000节点树(8秒)真的很慢。不能使用它:( – Ivan