ootid+id-sign(rootid)*id
desc,ordernum,然后结合deep就可实现树状的显示。
五、具体实现方法(以存储过程为例)
加贴存储过程:(省略注册用户检测以及积分部分内容)
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 ——回复的是最后一贴
ELSE
SELECT @ordernum=(@begnum+@endnum)/2——关键,取排序基数中值
INSERT into forum (rootid,deep,ordernum,……)
values(@rootid,@deep+1,@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
DELETE FROM forum where ordernum>=@begnum and ordernum<@endnum
and (rootid=@rootid or id=@rootid)
END
显示存储过程(略)
总结:由于省去了childnum字段,因此如果想要知道根贴(或子贴)有多少个子贴,则需使用统计方法或增加对应的字段记录,该问题可不列为树状结构讨论之列。
desc,ordernum,然后结合deep就可实现树状的显示。
五、具体实现方法(以存储过程为例)
加贴存储过程:(省略注册用户检测以及积分部分内容)
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 ——回复的是最后一贴
ELSE
SELECT @ordernum=(@begnum+@endnum)/2——关键,取排序基数中值
INSERT into forum (rootid,deep,ordernum,……)
values(@rootid,@deep+1,@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
DELETE FROM forum where ordernum>=@begnum and ordernum<@endnum
and (rootid=@rootid or id=@rootid)
END
显示存储过程(略)
总结:由于省去了childnum字段,因此如果想要知道根贴(或子贴)有多少个子贴,则需使用统计方法或增加对应的字段记录,该问题可不列为树状结构讨论之列。
| 对此文章发表了评论 |
