2012-03-22 42 views
1

我有一张表,其中包含我的帖子和我的意见。我们只发表一条评论,对评论没有评论。现在,我们正在对帖子进行ajax请求,然后在另一个查询中抓取注释,使用父帖子ID来获取适当的子注释。SQL Server 2008线程评论系统 - 什么更有效?

我想要做的就是将其整合到最高效的单一查询系统中。

这让我要么使用CROSS APPLY,或UNION,如果我没有记错,但也有一些注意事项:

  • 我们要选择的十大职位,顶部2每个
  • 帖子评论需要按降序列出
  • 评论需要按升序排列

这里上市是我们的CUR的例子租查询的文章和评论:

帖子:

SELECT TOP 10 ForumPostID, ForumID, ContentText, Hidden, S.Firstname, S.Lastname, 
CONVERT(VARCHAR(30),DATEADD(hh,CASE 
     WHEN DD.StartDate IS NOT NULL THEN 5 ELSE 6 
     END, 
FP.PostDate),126)+'Z' AS PostDate, 
PostDate AS UglyTime, TopPostID, 
(SELECT COUNT(*) FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID) AS  
'CommentCount', 
(SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID) AS 'Likes',  
CASE (SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID AND  
     Authuser = FP.Authuser) WHEN 0 THEN 'Like' ELSE 'You liked this.' END AS 'LikeText' 
FROM Admin.dbo.ForumPosts FP 
INNER JOIN Student.dbo.Student S 
     ON S.StudentUID = FP.Authuser 
INNER JOIN Admin.dbo.DayLightSavingsDates DD 
     ON FP.PostDate BETWEEN DD.StartDate AND DD.EndDate 
WHERE FP.ForumPostID NOT IN (SELECT Top 0 ForumPostID FROM Admin.dbo.ForumPosts FP2 ORDER BY 
FP2.ForumPostID DESC) 
AND FP.Hidden = 'N' AND FP.ContentText <> '' 
AND FP.PostType = 'post' 
ORDER BY FP.PostDate DESC 

评论:

SELECT TOP 50 ForumPostID, ForumID, ContentText, Hidden, S.Firstname, S.Lastname, 
CONVERT(VARCHAR(30),DATEADD(hh,CASE 
     WHEN DD.StartDate IS NOT NULL THEN 5 ELSE 6 END, 
FP.PostDate),126)+'Z' AS PostDate, 
PostDate AS UglyTime, TopPostID, 
(SELECT COUNT(*) FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID) AS  
     'CommentCount', 
(SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID) AS 'Likes', 
CASE (SELECT COUNT(*) FROM Admin.dbo.ForumLikes WHERE ForumPostID = FP.ForumPostID AND 
    Authuser = FP.Authuser) WHEN 0 THEN 'Like' ELSE 'You liked this.' END AS 'LikeText' 
FROM Admin.dbo.ForumPosts FP 
INNER JOIN Student .dbo.Student S 
ON S.StudentUID = FP.Authuser 
INNER JOIN Admin.dbo.DayLightSavingsDates DD ON FP.PostDate BETWEEN DD.StartDate AND DD.EndDate 
WHERE FP.ForumPostID NOT IN 
    (SELECT Top 0 ForumPostID FROM Admin.dbo.ForumPosts FP2 ORDER BY FP2.ForumPostID DESC) 
AND FP.ForumPostID IN 
    (SELECT Top 2 ForumPostID FROM Admin.dbo.ForumPosts FP3 WHERE FP3.TopPostID = FP.TopPostID 
     ORDER BY FP3.PostDate DESC) 
AND FP.Hidden = 'N' 
AND FP.ContentText <> '' 
AND FP.PostType = 'comment' 
AND FP.TopPostID IN (373, 371, 370, 369, 368, 367, 366, 365, 364, 363) 
ORDER BY FP.ForumPostID ASC 
+1

-1:以可读的方式格式化您的代码! – Akhil 2012-03-22 22:34:47

+0

对不起,在我准备好之前提交,但我没有点击按钮。现在应该会好一点。 – ilikenwf 2012-03-22 22:42:38

+0

*按钮自己点击!我发誓!* – 2012-03-22 23:04:06

回答

0

,可以在这里给出的是你需要看的执行计划中最重要的建议。我不知道这个方法。查询太复杂,无法提供具体建议。

但有一件事:你有很多表达式“(SELECT COUNT(*)FROM Admin.dbo.ForumPosts WHERE TopPostID = FP.ForumPostID)”。 SQL Server查询优化器在计算中使用这些表达式时遇到问题。它有时无法将它们转换为正常的连接,从而阻碍了很多优化。你可能想把它们转换成连接。尽管我现在可以说IN子句是安全的。

+0

我会保留这些计数作为表中的字段,并通过触发器进行维护。伯爵是一个非常繁重的操作。当你保持计数时你完全消灭了这个需求。 – TomTom 2012-03-23 14:12:40