|
这样的设计只要维护好每一个字段都为查询显示提高了效率!
请看下面的维护程序:
alter procedure AppSP_AddNew @ID integer ,@Title varchar(8000) =null ,@Content varchar(8000)=null as --declare @id int --set @id=0 if @ID=0 begin insert into Tree (ParentID,OrderID,Indent,Title,Content) values (0,0,0,@Title,@Content) --把帖子顶到上面: update Tree set RootID = ID ,MaxId = (select max(id) from Tree) where RootID is null end else begin --调整同一个"根帖"中,帖子的内部顺序: update Tree set OrderID = OrderID + 1 where RootID = (select rootid from tree where ID = @id) and OrderID > (select OrderID from Tree where ID = @id ) --插入回复的帖子,同时维护 RootID,ParentID,OrderID,Indent,remark,Title,Content insert into Tree (RootID,ParentID,OrderID,Indent,remark,Title,Content) select RootID,@ID,OrderID+1,Indent + 1 ,case when remark is null then cast(parentid as varchar) else remark + - + cast(parentid as varchar) end ,isnull(@Title,Re: + Title),@Content , ; &nb, sp; from Tree where id=@id --把帖子顶到上面: update Tree set maxid = (select max(id) from Tree ) where rootid = (select rootid from tree where id=@id ) end
该程序用于
1.增加新贴:
AppSP_AddNew 0,第一个问题,地球是圆的吗?
2.回复帖子:
AppSP_AddNew 1,Re: 第一个问题,地球是圆的!
这样,只需简单查询:
select *, remark + - + cast(parentid as varchar) + - + cast(id as varchar) , space(indent) + [ from tree order by MaxID desc,orderid 就可高效的实现帖子列表及其线索,级别等!
虽然维护时增加了一些工作量!
--相关DDL脚本:
CREATE TABLE [Tree] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [ParentID] [int] NULL , [RootID] [int] NULL , [OrderID] [int] NULL , [MaxID] [int] NULL , [Indent] [int] NULL , [Title] [varchar] (50), [Content] [varchar] (200) , [Remark] [varchar] (250) , CONSTRAINT [PK_Tree] PRIMARY KEY CLUSTERED ( [ID] ) ON [PRIMARY] ) ON [PRIMARY] 分页: [1] [2] [3] [4] [5] [6] [7] [8] [9] (编辑:网站学习网)
|