【问题标题】:How do I get 5 latest comments (SQL query for SQL Server ) for each user?如何为每个用户获取 5 条最新评论(SQL Server 的 SQL 查询)?
【发布时间】: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


    【解决方案1】:

    假设至少 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
    

    【讨论】:

    • 谢谢。我认为这很好用。可以不用ROW_NUMBER(),只用标准的SQL语法吗?
    • 您可以将 From cteRowNumber 替换为 select 语句。
    【解决方案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
    

    【讨论】:

    • 也感谢您的解决方案。
    【解决方案3】:
    SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC
    

    我认为应该这样做。

    【讨论】:

    • 它只会为我提供 1 个用户的最新 cmets,对吗?我需要为每个用户提供 5 个最新的 cmets。
    • "for each user" 可能意味着他想要同时为所有个用户提供数据,而不仅仅是一个用户。
    • 这不会返回 一个用户的 5 个最旧 (ASC) cmets 吗?你不应该使用时间戳 DESC 吗?
    • 对不起,误读了。然后选择 Joe Stefenlli 的解决方案 :)
    • 这里不再赘述,但 last_updated 列的存在表明 cmets 可以更新,并且比后来添加但不能更新的 cmets 变得“更新”。因此,我们不能使用 comment_id 作为货币程度的代理。
    【解决方案4】:

    在 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
    

    【讨论】:

    • "for each user" 可能意味着他想要同时为所有个用户提供数据,而不仅仅是一个用户。
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2023-01-22
    • 2020-08-31
    • 1970-01-01
    • 2010-11-06
    相关资源
    最近更新 更多