“中值排序基數(shù)法實(shí)現(xiàn)樹狀結(jié)構(gòu)”的補(bǔ)充
由于一時(shí)疏忽,造成了此法“對(duì)于int類型的基數(shù)字段,對(duì)原始貼的回復(fù)只能有31個(gè);numeric類型的基數(shù)字段,對(duì)原始貼的回復(fù)也不能超過(guò)120個(gè)”(實(shí)際上是對(duì)于int型字段,原始貼的回復(fù)第32個(gè)以上的樹狀結(jié)構(gòu)顯示開始紊亂,對(duì)于numeric型的基數(shù)字段,原始貼的回復(fù)從121個(gè)以上樹狀結(jié)構(gòu)顯示開始紊亂——回復(fù)并不會(huì)出問(wèn)題),這是由于計(jì)算機(jī)存儲(chǔ)精度引起的。 我們可以將加貼的存儲(chǔ)過(guò)程修改一下(加進(jìn)前面加上**號(hào)的行)以限制到了一定深度(在特定數(shù)據(jù)類型下,基數(shù)無(wú)法分辨)的時(shí)候不再以樹狀結(jié)構(gòu)顯示(而采用平顯——平行顯示,這樣做雖然有點(diǎn)象折衷的做法,但在實(shí)際上由于瀏覽器等的限制——即使在深度100的時(shí)候能以樹狀結(jié)構(gòu)顯示,但從你的瀏覽器看來(lái)的樹狀結(jié)構(gòu)的結(jié)果仍然不是清晰的——屏幕寬度不夠,會(huì)折行唄)。
加貼存儲(chǔ)過(guò)程:
CREATE PROCEDURE [add] @keyid int,@message varchar(50) OUTPUT———keyid為回復(fù)的貼子id號(hào),如果是新貼則為0,@message為出錯(cuò)信息 AS IF (@keyid=0) INSERT INTO forum (rootid,deep,ordernum,……) values(0,0,0,……) ELSE BEGIN DECLARE @rootid int,@id int,@deep int,@begnum float,@endnum float,@ordernum float SELECT @rootid=0,@id=0,@deep=0,@begnum=0,@endnum=0,@ordernum=0 SELECT @rootid=rootid,@id=id,@begnum=ordernum,@deep=deep from forum where id=@keyid IF (@id=0) BEGIN SELECT @message='要回復(fù)的貼子已經(jīng)被刪除!' return END ELSE BEGIN IF (@rootid=0) SELECT @rootid=@id——回復(fù)的是根貼,取其id為新加貼的rootid SELECT @endnum=ordernum where rootid=@rootid and ordernum>@begnum order by ordernum IF (@endnum=0) SELECT @ordernum=@begnum+65536 ——回復(fù)的是最后一貼,可以在此限制@ordernum的范圍以防溢出 ELSE **BEGIN **IF @endnum-@begnum>1 ——精度仍能分辨。此處的1為精度標(biāo)記,適合于基數(shù)字段為int,如果基數(shù)字段為numeric字段,請(qǐng)酌情選娶(呸呸呸,錯(cuò)別字來(lái)了),目的是使基數(shù)精度過(guò)小時(shí)限制深度增加,避免顯示時(shí)的紊亂 **SELECT @ordernum=(@begnum+@endnum)/2,@deep=@deep+1——關(guān)鍵,取排序基數(shù)中值 **ELSE **SELECT @ordernum=@begnum ——限制深度不能再增加,此貼與回復(fù)貼平行顯示,如果存在parentid字段,則要取parentid和回復(fù)貼的parentid一樣 **END **INSERT into forum (rootid,deep,ordernum,……) values(@rootid,@deep,@ordernum,……) END END Select @message='成功' return
剪枝存儲(chǔ)過(guò)程改為:
CREATE PROCEDURE [del] @keyid int,@message varchar(50) OUTPUT———keyid為要?jiǎng)h除的貼子id號(hào),如果是新貼則為0,@message為出錯(cuò)信息 AS DECLARE @rootid int,@id int,@deep int,@begnum float,@endnum float SELECT @rootid=0,@deep=0,@begnum=0,@endnum=0,@id=0 SELECT @id=id,@begnum=ordernum,@rootid=rootid,@deep=deep from forum where id=@keyid IF (@id=0) BEGIN SELECT @message='該貼子不存在!" return END ELSE BEGIN SELECT @endnum=ordernum from forum where rootid=@rootid and deep<=@deep and ordernum>@begnum order by ordernum IF (@endnum=0)——要?jiǎng)h除的是最后一個(gè)子枝或是根貼 DELETE FROM forum where ordernum>=@begnum and (rootid=@rootid or id=@rootid) ELSE ** BEGIN ** IF @begnum=@endnum ** DELETE FROM forum where id=@id and (rootid=@rootid or id=@rootid) ——已經(jīng)受精度限制的枝,只刪當(dāng)前貼 ** ELSE ** DELETE FROM forum where ordernum>=@begnum and ordernum<@endnum and (rootid=@rootid or id=@rootid) ** END END
雖然是限制,但此限制應(yīng)該是必須的,因?yàn)閷?shí)際上的回復(fù)深是不能太大的(就象我在這里灌到八九層的時(shí)候,討飯貓就大叫“打住打住”了,呵呵)
歡迎訪問(wèn)我的個(gè)人主頁(yè)http://swuse.yeah.net(原來(lái)bigeagle是說(shuō)我這一句話“目的明顯啊”)
|