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位數字。
我是使用了這麼一個笨方法。。希望能在這抛磚引玉,引來更好的更友善的實作方法:)