2011-10-05 73 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