我有多个用户在多个博客帖子上提交评论。用户可以在每篇博文上多次发表评论。我需要一个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
答案 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