2014-11-03 94 views
0

我有這樣的結構:Mysql的樹結構計算誰是活躍的所有兒童

樹: ID,PARENT_ID,LFT,rght邀請,USER_ID

用戶: ID,用戶名,活躍

我想要做的是一個單一的查詢(可能與子查詢??),將返回我樹中的每個頂部節點的子數量在用戶表中,活動設置爲1.任何想法我怎麼能去做這個?

+0

如果你的樹中可以有任意數量的層次,那將會很困難。如果你知道你最多隻有* n *個級別(n相當小),那麼你可以在一個查詢中做到這一點,該查詢在'Tree'表格上執行至多* n * -1個自連接。 – 2014-11-03 17:50:34

回答

0

由於您顯然可以擁有「無限」的關卡數量,所以這樣的單一命令是不可能的。但你可以

1)通過多次SQL調用的遞歸算法在程序中進行計數(無論是php,java,還是其他)。 < - 如果可以的話,這樣做。

2)將字段'cached_active_count'添加到樹表,並在每次插入,更新和刪除查詢時使用觸發器對其進行更新。這個選項最難設置,因爲它需要幾個觸發器,並且很容易出錯,但是如果你想要效率,那麼這個選項可以快速讀取結果。

3)製作SQL遞歸函數...但MySQL不喜歡遞歸,因此您需要使用循環和由臨時表構成的隊列進行僞遞歸,這不會再簡單易懂。

4)生成SQL函數,它將循環遍歷整個表中的查詢,查找最底部沒有計算的節點並逐層計算它們。這個解決方案可能是最簡單的,但也是效率最低的。 *(最簡單!=簡單)

5)但是,如果除了「無限」深度實際上有限,我們假設深度最大N個級別,則可以製作由「N表」連接組成的「UGLY」sql select查詢。