SQL Query每个博客帖子的最新用户评论限制为每个用户一个?

时间:2010-07-15 15:43:28

标签: sql-server sql

我有多个用户在多个博客帖子上提交评论。用户可以在每篇博文上多次发表评论。我需要一个SQL查询(sql server 2008)来获取给定BlogPostId的每个用户的最后一条评论。

让我们说3位用户在特定博客帖子上共提交了10条评论。对于博客文章#1,用户A提交了5条评论,用户B提交了2条评论,用户C提交了3条评论。

对于特定的BlogPostId(例如#1),我如何获得每个用户的最新评论,仅限于最新评论(例如,每个用户一个评论)?

最终结果应该产生三行(例如)

(User A) CommentId, BlogPostId, UserId, CommentData
(User B) CommentId, BlogPostId, UserId, CommentData
(User C) CommentId, BlogPostId, UserId, CommentData

5 个答案:

答案 0 :(得分:3)

由于它是MS SQL 2008,为什么不使用ROW_NUMBER()

WITH last_comment AS 
(
    SELECT  ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY DateAdded) as RowIndex,
            *
    FROM    BlogPost B 
    WHERE   BlogPostId = @BlogPostId
)
SELECT *
FROM    last_comment
WHERE   RowIndex = 1

答案 1 :(得分:1)

几种可能的解决方案之一,因为您没有在问题中发布该信息而对您的架构进行了一些猜测:

SELECT
    C1.comment_id,
    P.blog_post_id,
    C1.user_id,
    C1.comment_data
FROM
    Blog_Posts P
LEFT OUTER JOIN Comments C1 ON
    C1.blog_post_id = P.blog_post_id
LEFT OUTER JOIN Comments C2 ON
    C2.blog_post_id = C1.blog_post_id AND
    C2.user_id = C1.user_id AND
    C2.comment_date > C1.comment_date
WHERE
    P.blog_post_id = @blog_post_id AND
    C2.comment_id IS NULL

如果C2.comment_id为null,则必须是因为之后没有评论可以加入,所以C1必须是最新的。如果在时间上存在确切的关系,则可能会为同一用户收到两条评论。

答案 2 :(得分:1)

有很多方法可以做到这一点。使用排名功能:

with cte as (
   select *, row_number() over (partition by UserId order by PostedtDate desc) as rn
   from Comments
   where PostId = @postId)
select *
from cte
where rn = 1;

使用聚合和交叉申请:

with cte as (
   select distinct UserId
   from Comments
   where PostId = @postId)
select * 
from cte
cross apply (
   select top(1) *
   from Comments c
   where c.UserId = cte.UserId
   and c.PostId = @postId
order by PostedDate desc);

最后,真正重要的问题不是你如何查询这些信息(这很简单,你可能在10分钟内得到10个答案),但是你如何设计你的模式来快速查询。

答案 3 :(得分:0)

你可以试试这个:

select * from comments where blogpost_id = 3333 and comment_id in
(select max(comment_id) from comments where blogpost_id = 3333 group by UserId)

答案 4 :(得分:-1)

从BlogPostID = 1的评论中选择Top(1)CommentID,Comment,UserName,CreateDate 按CreateDate,UserName,Comment,CommentID排序 按用户名分组

好的,这只是在我不知道您的数据库的情况下 您需要获取博客帖子的所有评论 那么你需要按照创建注释的日期排序asc或desc 然后你需要为用户分组并从列表中选择第一个... 根据你的排序方式你也可以选择最后一个...

HTH