當前位置:蘿卜系統下載站 > 技術開發教程 > 詳細頁面

“中值排序基數法完成樹狀結構”的補充

“中值排序基數法完成樹狀結構”的補充

更新時間:2019-06-23 文章作者:未知 信息來源:網絡 閱讀次數:

“中值排序基數法實現樹狀結構”的補充

由于一時疏忽,造成了此法“對于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是說我這一句話“目的明顯啊”)

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

網站地圖xml | 網站地圖html
亚洲嫩草影院久久精品