基于两列的排名

时间:2019-01-29 16:58:32

标签: php sql mariadb

通过比较三列来从数据库中查找特定用户的排名。

Name | Score | Attempts | Time
test |   2   |   4      |  2019-01-29 19:50:11
tes2 |   2   |   1      |  2019-01-29 20:14:11

因此预期输出应为

Name | Score | Attempts | Time                  | Rank
tes2 |   2   |   1      |  2019-01-29 20:14:11  |  1
test |   2   |   4      |  2019-01-29 19:50:11  |  2

如果我想为用户“ test”搜索等级,那么我应该得到等级2作为答案。

我已经完成了部分工作,可以从中获得总体排名,但是我找不到个人用户的排名。

这是我为获得总体排名而编写的代码。

select t.*, @r := @r + 1 as `new_rank`
from  tbl t,
(select @r := 0) r
order by `Rank` asc, `Tasks` desc`

我正在使用的SQL版本是10.1.9-MariaDB

2 个答案:

答案 0 :(得分:1)

使用row_number()rank(),具体取决于您要处理领带的方式。例如:

select t.*, row_number() over (order by rank asc, task desc) as new_rank
from t;

如果您正在使用旧版本的MySQL(如代码段所示),则可以使用变量,但可能需要子查询:

select t.*, (@r := @r + 1) as new_rank
from (select t.* from tbl t order by Rank asc, Tasks desc) t cross join
     (select @r := 0) r;

一种获取特定行的方法:

select t.*
from (select t.*, (@r := @r + 1) as new_rank
      from (select t.* from tbl t order by Rank asc, Tasks desc) t cross join
           (select @r := 0) r
     ) t
where t.name = ?;

答案 1 :(得分:1)

您可以使用dense_rank,以帮助您按数字顺序排名。

*Syntax : 
    DENSE_RANK() OVER (
       [ PARTITION BY partition_expression ]
       [ ORDER BY order_list ]
    )* 

select t.*, dense_rank() over (order by rank asc, task desc) as new_rank
from t;