use*_*751 4 t-sql sql-server sql-server-2005
我有一个论坛数据库,可以将论坛信息存储在一个列中.论坛允许无限制的子论坛.
表名 - 论坛
| ForumID | ParentForumID | Name | Description | TopicCount | ReplyCount | LastPost |
Run Code Online (Sandbox Code Playgroud)
给定ForumID的参数我想SUM的TopicCount和ReplyCount所有子项.我也试图返回最新的LastPost,指定为DATETIME.
我搜索了谷歌和这个论坛,并了解我应该使用递归CTE,但我在理解语法时遇到一些困难.这是我的CTE - 正在进行的工作.
WITH CTE (ForumID, ParentForumID)
AS
(
SELECT ForumID AS Descendant, ParentForumID as Ancestor
FROM forums
UNION ALL
SELECT e.Ancestor
FROM
CTE as e
INNER JOIN CTE AS d
ON Descendant = d.ParentForumID
)
SELECT e.Descendant, SUM(TopicCount) AS topics, SUM(ReplyCount) AS replys
FROM CTE e
WHERE e.Ancestor = 1
Run Code Online (Sandbox Code Playgroud)
其中1 =论坛ID的参数.
在此先感谢您的帮助!
你做得很好 - 你很亲密:-)
基本上,你需要:
TopicCount和ReplyCount计数器所以你的代码应该是这样的:
DECLARE @RootForumID INT
SET @RootForumID = 1 -- or whatever you want...
;WITH CTE AS
(
-- define the "anchor" query - select the chosen forum
SELECT
ForumID, TopicCount, ReplyCount, LastPost
FROM
dbo.forums
WHERE
ForumID = @RootForumID
UNION ALL
-- select the child rows
SELECT
f.ForumID, f.TopicCount, f.ReplyCount, f.LastPost
FROM
dbo.forums f
INNER JOIN
CTE on f.ParentForumID = CTE.ForumID
)
SELECT
SUM(TopicCount) AS topics,
SUM(ReplyCount) AS replys,
MAX(LastPost) AS 'Latest Post'
FROM
CTE
Run Code Online (Sandbox Code Playgroud)
当然,您可以将其包装到一个存储过程中,该过程将初始"root" ForumID作为参数.