通过比较三列来从数据库中查找特定用户的排名。
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
答案 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;