2011-01-11 48 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 
相關問題