`
zhangzhiya
  • 浏览: 23299 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类

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

1
0
分享到:
评论
1 楼 xwq18 2010-10-31  
 

相关推荐

Global site tag (gtag.js) - Google Analytics