如何在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中获取这个特定的用户排名查询?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL实现排名查询并指定用户查看排名

使用 MySQL 获取用户排名

SQL(MySQL + PHP) 查询,查询排名,表内一个人多条数据,查出最大的那条排名,请问!

MySQL实现排名并查询指定用户排名功能,并列排名功能

如何让 sql 排名查询工作以查找特定 id 的排名

sql - 有没有办法过滤SELECT查询的结果,使用另一个SELECT查询?