天天看點

關于在Oracle和MySql中實作樹形菜單方法探讨

select t.*, t.SCOPE as sc from DICT_TREE t  connect by prior t.DICT_TREE_ID=t.UP_DICT_ID start with t.UP_DICT_ID=82
           

以上查詢語句傳回的結果集正好是樹形結構的,對生成樹形菜單非常友善,不用再對資料進行整理排序,直接将結果集循環列印即可。

在查詢時若想對某個節點下的子節點進行排序可在查詢語句末尾加上如下代碼

order sibling by t.ORDER_NUM
           

這樣就能實作對子節點進行排序了。

以上方法構造樹形菜單對于使用oracle資料庫的應用來說非常的友善,但如果是使用mysql或其他資料庫的話,就不行了。據我所知mysql好象沒有類似于connect by prior這樣的遞歸查詢語句。前段時間做的一個使用mysql資料的項目在維護樹形菜單是通過維護一個rankcode的字段實作結果集的樹狀排序的。以下是我的實作方法:

每級節點都使用兩位數字來辨別,子節點加上父節點的rankcode

一級節點的rankcode為兩位數字:01~99

二級節點的rankcode為四位數字:0101~0199、0201~0299、0n~0n99

例如:

菜單名 rankcode值

一級菜單A 01

二級菜單a 0101

二級菜單b 0102

一級菜單B 02

二級菜單c 0201

二級菜單d 0202

一級菜單C 03

二級菜單d 0301

三級菜單1 030101

這樣通過對rankcode進行排序,傳回的結果集也是樹形的。在菜單的管理中需要對rankcode進行維護。還有個弊端就是每級節點數量有限制,除非将每級節點的辨別增加到3位數字。

我是使用了這麼一個笨方法。。希望能在這抛磚引玉,引來更好的更友善的實作方法:)