我有一張如下所示的表格:comment_id,user_id,comment,last_updated。如何爲每個用戶獲取5條最新評論(針對SQL Server的SQL查詢)?
Comment_id在這裏是關鍵。每個用戶可能有多個評論。
如何爲每個用戶獲取5條最新評論(針對SQL Server的SQL查詢)?
輸出應該與原始表相似,只是將用戶的評論限制爲每個用戶最近的5個評論。
我有一張如下所示的表格:comment_id,user_id,comment,last_updated。如何爲每個用戶獲取5條最新評論(針對SQL Server的SQL查詢)?
Comment_id在這裏是關鍵。每個用戶可能有多個評論。
如何爲每個用戶獲取5條最新評論(針對SQL Server的SQL查詢)?
輸出應該與原始表相似,只是將用戶的評論限制爲每個用戶最近的5個評論。
至少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
SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC
我認爲應該這樣做。
在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
喬的回答是在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
它會給我1個用戶的最新評論,對吧?每個用戶需要5條最新評論。對於每個用戶,「 – myforums 2011-01-11 19:58:17
」可能意味着他希望同時爲所有*用戶提供數據,而不僅僅是針對一個用戶。 – dkarp 2011-01-11 19:59:00
wouldn; t返回**最老的(ASC)**一個用戶**的評論?你不應該使用時間戳DESC? – Nishant 2011-01-11 19:59:02