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位数字。
我是使用了这么一个笨方法。。希望能在这抛砖引玉,引来更好的更方便的实现方法:)