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