如何在mysql中获取这个特定的用户排名查询?
Posted
技术标签:
【中文标题】如何在mysql中获取这个特定的用户排名查询?【英文标题】:How to get this specific user rankings query in mysql? 【发布时间】:2014-06-27 09:24:45 【问题描述】:我的用户数据库中有 tbl_items,我想对具有特定 ID (514) 的特定项目的用户排名进行排序。我的开发环境中有这组数据的测试数据:
mysql> select * from tbl_items where classid=514;
+---------+---------+----------+
| ownerId | classId | quantity |
+---------+---------+----------+
| 1 | 514 | 3 |
| 2 | 514 | 5 |
| 3 | 514 | 11 |
| 4 | 514 | 46 |
| 5 | 514 | 57 |
| 6 | 514 | 6 |
| 7 | 514 | 3 |
| 8 | 514 | 27 |
| 10 | 514 | 2 |
| 11 | 514 | 73 |
| 12 | 514 | 18 |
| 13 | 514 | 31 |
+---------+---------+----------+
12 rows in set (0.00 sec)
到目前为止一切顺利:) 我写了以下查询:
set @row=0;
select a.*, @row:=@row+1 as rank
from (select a.ownerid,a.quantity from tbl_items a
where a.classid=514) a order by quantity desc;
+---------+----------+------+
| ownerid | quantity | rank |
+---------+----------+------+
| 11 | 73 | 1 |
| 5 | 57 | 2 |
| 4 | 46 | 3 |
| 13 | 31 | 4 |
| 8 | 27 | 5 |
| 12 | 18 | 6 |
| 3 | 11 | 7 |
| 6 | 6 | 8 |
| 2 | 5 | 9 |
| 7 | 3 | 10 |
| 1 | 3 | 11 |
| 10 | 2 | 12 |
+---------+----------+------+
12 rows in set (0.00 sec)
对用户进行正确排名。但是在有很多记录的表中,我需要执行以下操作:
1) 能够获得列表的一小部分,即用户排名实际所在的位置,这可以让我获得周围的记录,保持整体排名: 我尝试通过将用户变量设置为当前用户的排名并使用偏移量和限制来做这些事情,但无法保留整体排名。
这应该让我得到如下信息(例如 ownerId=2 和环境限制 5:
+---------+----------+------+
| ownerid | quantity | rank |
+---------+----------+------+
| 3 | 11 | 7 |
| 6 | 6 | 8 |
| 2 | 5 | 9 | --> ownerId=2
| 7 | 3 | 10 |
| 1 | 3 | 11 |
+---------+----------+------+
5 rows in set (0.00 sec)
2) 我还需要另一个查询(最好是单个查询),它可以让我获得前 3 个位置 + 具有特定 id 的特定用户的排名,最好使用单个查询,无论他是否位居榜首3个地方与否。我也无法得到这个
如下所示(例如 ownerId=2):
+---------+----------+------+
| ownerid | quantity | rank |
+---------+----------+------+
| 11 | 73 | 1 |
| 5 | 57 | 2 |
| 4 | 46 | 3 |
| 2 | 5 | 9 | --> ownerId=2
+---------+----------+------+
4 rows in set (0.00 sec)
此外,我对在具有数百万条记录的表上的查询性能有点担心... 希望有人帮助:)
【问题讨论】:
【参考方案1】:1) 给定 id 周围的 5 个条目。
set @row=0;
set @rk2=-1;
set @id=2;
select b.* from (
select a.*, @row:=@row+1 as rank, if(a.ownerid=@id, @rk2:=@row, -1) as rank2
from (
select a.ownerid,a.quantity
from tbl_items a
where a.classid=514) a
order by quantity desc) b
where b.rank > @rk2 - 3
limit 5;
虽然您会得到一个额外的列rank2
:您可能希望通过明确的列列表而不是b.*
将其过滤掉。也许可以使用having
子句而不是额外的嵌套。
2) 3 个排名靠前的条目 + 1 个特定 ID
select b.* from (
select a.*, @row:=@row+1 as rank
from (
select a.ownerid,a.quantity
from tbl_items a
where a.classid=514) a
order by quantity desc) b
where b.rank < 4 or b.ownerid=@id
【讨论】:
嗨,伙计,看起来不错。但是,对于两个查询,它都为我提供了“'where 子句'中的未知列 'rank'”+ 在第二个查询中的 from 之前有一个额外的逗号... 现在应该会更好。请尝试一下,如果有问题,请告诉我。 第一个查询导致相同的错误,而第二个查询导致:“使用正确的语法靠近 '在 (1,2,3) 中具有 a.rank 或 a.ownerid=@id'在第 1 行" 最后不得不下单 嗨,伙计。查询 1 效果很好,但是如果请求的用户排名第一,它只会给我 3 个结果......在这种情况下,是否可以选择以下 4 个用户?以上是关于如何在mysql中获取这个特定的用户排名查询?的主要内容,如果未能解决你的问题,请参考以下文章