我有一个论坛数据库,可以将论坛信息存储在一个列中。该论坛允许无限制的子论坛。
表名 - 论坛
| ForumID | ParentForumID | Name | Description | TopicCount | ReplyCount | LastPost |
如果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
其中1 =论坛ID的参数。
提前感谢您的帮助!
答案 0 :(得分:5)
你做得很好 - 你很接近: - )
基本上,您需要:
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
当然,您可以将其包装到一个存储过程中,该过程将初始的“root”ForumID
作为参数。