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[],怎么设置按行数和列数显示