建议看看这个帖子,邹建回复的,与此问题有共性。
http://community.csdn.net/Expert/TopicView.asp?id=4142266这个方法关键是要计算出累积编号,有了累积编号了,就可以找到任意级了。
你的表上增加一个冗余列,
id pid 类别,累积编号
01 01 X1 0101
02 01 X2 0102
这个累积编号,需要用算法来实现。
http://community.csdn.net/Expert/TopicView.asp?id=4142266这个方法关键是要计算出累积编号,有了累积编号了,就可以找到任意级了。
你的表上增加一个冗余列,
id pid 类别,累积编号
01 01 X1 0101
02 01 X2 0102
这个累积编号,需要用算法来实现。
某一级的id是越变越大但却要逆序出来。我还想过一招但不会写,也不知道可不可行,就是一个分支一个分支的插入,sid的值构造为插入的顺序值。(不知道我这句话说清楚了没有)。因为我发现邹建和另一个大侠的(好像就是你的吧),写过的遍历都是先按层(级)插,再对其子做遍历。如果能一颗子树一颗子树的插就可以解决了,插的时候就可以按order by postTime desc的顺序来,产生的sid正好就是从小到大了。
在建表的时候就构造一冗余列tid.(tid=100-id)
再按照邹建的办法针对tid去构造sid,好像正好可以满足。
办法有点傻。
CREATE function f_GetChild(@id int)
returns @re table([id] int,[level] int,sid varchar(8000))
as
begin
declare @l int
set @l=0
insert @re select SubID,@l,right((10000+(10000-SubID)),4)
from my_bbsPost where parentSubID=@id
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.SubID,@l,b.sid+right((10000+(10000-a.SubID)),4)
from my_bbsPost a,@re b
where a.parentSubID=b.[id] and b.[level]=@l-1
end
return
end
就是把邹建的10000+subID改成10000+(10000-subID)而已。