2011-01-11 50 views

回答

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 
0
SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC 

我认为应该这样做。

+0

它会给我1个用户的最新评论,对吧?每个用户需要5条最新评论。对于每个用户,“ – myforums 2011-01-11 19:58:17

+0

”可能意味着他希望同时为所有*用户提供数据,而不仅仅是针对一个用户。 – dkarp 2011-01-11 19:59:00

+0

wouldn; t返回**最老的(ASC)**一个用户**的评论?你不应该使用时间戳DESC? – Nishant 2011-01-11 19:59:02

0

在2005年SQLSERVER,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 
2

乔的回答是在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 
相关问题