`
qinysong
  • 浏览: 190863 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Re: 一个捆扰我好几天sql分组排(树形结构查询+排序)

SQL 
阅读更多

[quote="junjie314"]  有谁能不能说具体的实现!~~现在如果光排序的那没问题,但是各节点之间不是有顺序的吗??这个顺序是可以改的..现在主要问题是如果要改这个的话就比较麻烦了..比如有两个父节点顺序是23和38  现在把23这个改成39的话..那23下面的所有子节点都要修改..
  这个好象比较麻烦,要么是我设计的问题???[/quote]
首先创建一个SQL函数:weightValue,如下
[code]CREATE FUNCTION weightValue(@idValue int) RETURNS bigint AS
BEGIN
 DECLARE @return bigint
 DECLARE @fatherID int
 DECLARE @number int
 DECLARE @menuPath VARCHAR(50)
 DECLARE @treeLevel int
 DECLARE @weightLevel bigint

 SET @return = 0
 SET @weightLevel = 1

 SELECT @fatherID=fatherID,@menuPath=menuPath,@number=number FROM treeTable WHERE id=@idValue

 SELECT @treeLevel=len(@menuPath)-len(replace(@menuPath,'/',''))
 WHILE(@treeLevel<9) --此处9为目录层次数,经测试bigInt可以支持9级目录,再多目录层次就会出现益出
 BEGIN
  SET @weightLevel=@weightLevel*100
  SET @treeLevel=@treeLevel+1
 END
 SET @return=@number*@weightLevel

 IF(@fatherID = 1)
 BEGIN
  RETURN(@return)
 END

 RETURN ([dbo].weightValue(@fatherID)+@return)
END[/code]

然后一个简单的查询SQL即可,如下:
[code]SELECT id,fatherId,menuPath,number FROM treeTable ORDER BY [dbo].weightValue(id)[/code]

查询结果就是想要的排列顺序,结果如下,因为结果是实时查询,所以节点可以随时配置
[code]112 1 /112 23
114 112 /112/114 1
116 114 /112/114/116 8
115 114 /112/114/115 9
113 112 /112/113 2
107 1 /107 38
109 107 /107/109 1
111 109 /107/109/111 4
110 109 /107/109/110 5
108 107 /107/108 2[/code]

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics