首页 新闻 会员 周边 捐助

sql分组排(树形结构查询+排序)

0
悬赏园豆:50 [已解决问题] 解决于 2012-04-12 18:52
  • 我要做的是一个菜单的排序问题   
  • id           fun_name           parent_id            sort_id  
  • 1               root                     0                      1
  • 107           |name                  1                      38  
  • 108           || her                   107                   2
  • 110           |||is109                109                   1
  • 109           || his                    107                   1  
  • 98             |namesf               1                       2
  • 111           |||is109_2            109                    3  

     我要做的是按照 parent_id 分组,然后在按照sort_id排序即

 

  • id           fun_name           parent_id            sort_id  
  • 1               root                     0                      1
  • 107           |name                  1                      38  
  • 108           || her                   107                   2
  • 109           || his                    107                   1  
  • 110           |||is109                109                   1
  • 111           |||is109_2            109                    3  
  • 98             |namesf               1                       2

意思就是父类排序,然后当前父类面就跟随子类,排序,子类下面还有...第一个父类排序完了就是第二个父类

1        1            1

    1-1     1-1          1-1

       1-1-1    1-1-1    1-1-1

2        2              2

  2-1   2-2           2-3

3         3             3

  3-3     3-3        3-3          层级式排序,第一个父类下面是子类一直到此结束,然后再是第二个类别排序,一次类推,N级。

 

< >
分享
最佳答案
0

两种办法,一种办法是把所有数据都载入到程序中,然后用c#处理

另一种办法是修改表的设计,加上TreeCode字段,TreeCode字段值的规律如下

00001>

00001>00001>

00001>00002>

00001>00003>

00002>

00002>00001>

00002>00002>

00002>00003>

这个TreeCode字段是冗余字段,通过它可以很方便的取到你要求排序的层级数据

如果这张表的数据量很小的话,建议你把数据载入到程序中用C#写个递归函数处理。如果数据量很大,并且你也有条件修改表结构的话,可以添加冗余字段,解决此问题。

收获园豆:50
玉开 | 大侠五级 |园豆:8822 | 2012-04-09 17:20

支持你的做法,只是方法二有一个缺点:就是你举的例子,菜单不能超过四层

小小刀 | 园豆:1991 (小虾三级) | 2012-04-09 19:15

@小小刀: 

菜单几层和这个字段的长度有关系,如果这个字段长度是100的话,每层最多9999个,支持25层。其实用不了那么多的

玉开 | 园豆:8822 (大侠五级) | 2012-04-10 08:44

谢谢您的回复,数据量即使小各人不建议程序里递归,消耗资源太大,而且数据量随着时间推移会逐渐变大,所以推荐数据库递归, 谢谢你,及一楼,最终还是采用一楼的做法,添加冗余字段,解决了....诚心感谢,祝您天天开心。

blue_sky_alf | 园豆:72 (初学一级) | 2012-04-12 18:50

谢谢您的回复,豆豆给你了,谢谢,其他话不多说。祝您天天开心哈,以后有问题希望伙计帮助哈,虽然我最终方案和你的一样,但是在你回复之前我已经解决了,豆豆还是给你了,谢谢~!

blue_sky_alf | 园豆:72 (初学一级) | 2012-04-12 18:51
其他回答(1)
0

select ROW_NUMBER() over(partition by parent_id order by stort_id) as rownum,Parent_ID,stort_id
 from 表,你再改改

刘满意 | 园豆:22 (初学一级) | 2012-04-09 17:35

谢谢您的回复,我是sqlserver,你给的方案是 oracle ,不过后来还是用sql的  CTE 解决了,就是一楼说的加一个冗余字段....不过非常感谢您的参与,谢谢~!祝你天天开心........

支持(0) 反对(0) blue_sky_alf | 园豆:72 (初学一级) | 2012-04-12 18:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册