MySQL 按行数选择 WHERE IN 和 LIMIT

Posted

技术标签:

【中文标题】MySQL 按行数选择 WHERE IN 和 LIMIT【英文标题】:Select WHERE IN and LIMIT by number of rows 【发布时间】:2014-11-12 20:54:05 【问题描述】:

我有一张像这样的桌子

 userid  |  value   | time

    1        0          1
    1        1          2
    1        2          3
    3        5          4
    4        6          5
    1        9          6
    3        10         7

在查询中使用选择位置,我想选择用户名、值和时​​间,但限制为每个用户名提取的总行数

我的 SELECT 查询,

select userid, value, time from table where userid in (1,3) order by time desc;

这个查询输出所有的值,像这样

 userid  |  value   | time

    1        0          1
    1        1          2
    1        2          3
    3        5          4
    3        10         7

我会悬停希望将每个用户标识的行数限制为两个以获得这样的输出

   userid  |  value   | time

    1        0          1
    1        1          2
    3        5          4
    3        10         7

我尝试使用限制,但这限制了整个输出的行数。任何建议或指示将不胜感激。

【问题讨论】:

【参考方案1】:

您可以使用排名查询来限制每个用户的行数

select userid, 
value,
`time`
from (
select *,
@r:= case when @g = userid then @r + 1 else 1 end row_num,
@g:=userid
from test t
cross join (select @g:= null,@r:=0) t1
where userid in (1,3)
order by userid,value,`time` desc
) t2
where row_num <= 2

上面的查询将为同一用户的每条记录提供排名,例如用户 1 有 3 条记录,他们将分配排名为 1,2,3,如果用户 2 有 2 条记录,那么用户 2 的排名将是 1,2父查询我只是根据排名过滤记录,只返回排名小于等于 2 的结果,对于每个用户,只有 2 行排名为 1 和 2 将被返回

Demo

【讨论】:

你能解释一下吗?而且这么贵。 @user3569964 查看我的更新答案,是的,如果您的用户 1,3 有太多行,它可能会很昂贵,但您还需要索引您的 userid 如果是这种情况,为一组用户标识选择最新的 3 个值的最快和最有效的方法是什么。我看到很多社交网络节目,比如一组用户发布的最后 3 个帖子。 @user3569964 其他 RDBMS 已经内置了像 ROW_NUMBER 这样的函数来计算 SQL-Server、Postgre Oracle 等行的排名,但不幸的是 mysql 没有这些窗口函数,所以做这种类型的查询在Mysql中我已经在我的答案中显示了

以上是关于MySQL 按行数选择 WHERE IN 和 LIMIT的主要内容,如果未能解决你的问题,请参考以下文章

excel16版表格显示为RC[],怎么设置按行数和列数显示

如何在 MySQL 5.7 中将 WHERE IN 与空值一起使用?

按行数聚合值

MySQL在where子句中选择查询

Where - OLAP Cube 中的 In 子句

如何将行转换为按行数创建标题的列