【发布时间】:2011-01-12 04:49:54
【问题描述】:
我有一个如下所示的表:comment_id、user_id、comment、last_updated。
Comment_id 是这里的关键。每个用户可能有多个 cmets。
如何为每个用户获取 5 个最新的 cmets(SQL Server 的 SQL 查询)?
输出应该与原始表类似,只是将用户的 cmets 限制为每个用户最近的 5 个。
【问题讨论】:
标签: sql sql-server
我有一个如下所示的表:comment_id、user_id、comment、last_updated。
Comment_id 是这里的关键。每个用户可能有多个 cmets。
如何为每个用户获取 5 个最新的 cmets(SQL Server 的 SQL 查询)?
输出应该与原始表类似,只是将用户的 cmets 限制为每个用户最近的 5 个。
【问题讨论】:
标签: sql sql-server
假设至少 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
【讨论】:
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
【讨论】:
SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC
我认为应该这样做。
【讨论】:
在 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
【讨论】: