如何为每个用户获取5条最新评论(SQL Server的SQL查询)?

时间:2011-01-11 19:49:44

标签: sql sql-server

我有一个如下所示的表:comment_id,user_id,comment,last_updated。

Comment_id是关键所在。每个用户可能有多个评论。

如何为每个用户获取5条最新评论(SQL Server的SQL查询)?

输出应该与原始表类似,只是将用户的评论限制为每个用户最近的5个。

4 个答案:

答案 0 :(得分:10)

至少假设SQL Server 2005,您可以使用窗口函数(row_number)和CTE

;with cteRowNumber as (
    select comment_id, user_id, comment, last_updated, ROW_NUMBER() over (partition by user_id order by last_updated desc) as RowNum
        from comments
)
select comment_id, user_id, comment, last_updated
    from cteRowNumber
    where RowNum <= 5
    order by user_id, last_updated desc

答案 1 :(得分:2)

Joe的回答是在SQL Server中执行此操作的最佳方式(至少,我认为是,我不熟悉CTE)。但这是一个使用标准SQL的解决方案(不是很快!)

 SELECT * FROM comments c1
   WHERE (SELECT COUNT(*) FROM comments c2 
          WHERE c2.user_id = c1.user_id AND c2.last_updated >= c1.updated) <= 5

答案 2 :(得分:0)

SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC

我认为应该这样做。

答案 3 :(得分:0)

在SqlServer 2005中,LIMIT无效。

相反,做一些事情:

SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY comment_id ASC

请注意,这假设comment_id是单调递增的,这可能并不总是对于标识字段的有效假设(例如,如果它们需要重新编号)。您可能想要考虑替代字段,但基本结构将是相同的。

请注意,如果您按日期字段排序,则需要按降序排序,而不是按升序排序,例如

SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY last_updated DESC