mysql - 如何在mysql中获取这个特定的用户排名查询?

标签 mysql sql performance ranking

我的用户数据库中有 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) 给定 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

关于mysql - 如何在mysql中获取这个特定的用户排名查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24448327/

相关文章:

mysql - 从以下查询中选择每个结果之一

mysql - MYSQL有什么独特之处?我可以放置 unique 以防止重复输入吗?

MySql 触发器不会计算

sql - IN 子句 Oracle 中的值限制

performance - 是什么导致了这个过多的 "Composite Layers"、 "Recalculate Style"和 "Update Layer Tree"循环?

php - 将 MySQL 变量保存在 PHP $_SESSION 变量中

mysql - 如何根据不同类别的分数将 "rank"列添加到mysql表中?

mysql - 以下哪种数据结构更容易被接受,为什么?

javascript - 为什么使用 && 的条件语句速度快两倍

windows - 如何在 Win7 中模拟重启以测试应用程序冷启动时间