2015-10-14 61 views
1

我被困在试图找出一种方法来分配基于两个值的排名。我的表如下:基于两列的Mysql排名

--------------------------------------- 
| id | Student | Tasks | Errors | Rank | 
--------------------------------------- 
| 1 | Vegeta | 80 | 1500 | 18.7 | 
--------------------------------------- 
| 2 | Ria  | 100 | 150 | 1.5 | 
--------------------------------------- 
| 3 | John | 200 | 300 | 1.5 | 
--------------------------------------- 
| 4 | Goku | 24 | 100 | 4.16 | 
--------------------------------------- 
| 5 | Piccolo | 80 | 148 | 1.85 | 
--------------------------------------- 

排名值计算将错误/任务,所以我可以有最好的学生的想法,但是,约翰和RIA具有相同的排名却约翰是一个更好的学生,如他做得比利雅更多的任务,所以我需要他指派等级1 - RIA将等级2 - 短笛等级3 - 悟空等级4和贝吉塔排名5.

我试图

SELECT * from students ORDER BY Task DESC, Errors ASC 

但只按Task排序,它似乎忽略第二个值,排序rank会好的,但那我该如何分配正确的订单?

要分配的新rank应该基于最大任务数量。最少的错误数量,因此具有更多任务和更少错误的学生应该位于第1位,依此类推。

+0

要如何计算的排名目前尚不清楚。请包括预期的输出。您的示例查询的行为与预期相同。 –

+0

嘿蒂姆,排名将是更多的任务与更少的错误,而更多的任务和更少的错误用户有更高的排名。 – Aramil

回答

1

试试这个;

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

演示sqlfiddle

如果您没有,叔具有rankErrors/Tasks)柱然后;

select 
    `id`, `Student`, `Tasks`, `Errors`, 
    @r := @r + 1 as `rank` 
from tbl t, 
(select @r := 0) r 
order by (`Errors`/`Tasks`) asc, `Tasks` desc 

sqlfiddle

如果你只想order您的结果,那么,

order by `Rank` asc, `Tasks` desc 

order by (`Errors`/`Tasks`) asc, `Tasks` desc 

编辑 如果一个新的用户只有20任务和0误差

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

sqlfiddle

+0

这个工作很好,但我发现一个问题,如果一个新用户只有20个任务和0个错误,那么他获得1级,他不应该像他一样只是与约翰比较的一些任务。更新演示[链接] http://sqlfiddle.com/#!9/7c22a/1 – Aramil

+0

如果错误和等级为0,他应该放在最后? – Praveen

+0

是的,因为最好的学生是具有更多任务和更少错误的学生,所以具有10个任务和0个错误的学生在200个任务和300个错误之下低于一个,我想。 – Aramil

1

使用您计算在ORDER BY

SELECT * from students 
ORDER BY (Errors/Task), Task DESC; 

结果:

MariaDB [test]> select * from students; 
+----+---------+------+--------+------+ 
| id | Student | Task | Errors | Rank | 
+----+---------+------+--------+------+ 
| 1 | Vegeta | 80 | 1500 | 18.7 | 
| 2 | Ria  | 100 | 150 | 1.5 | 
| 3 | John | 200 | 300 | 1.5 | 
| 4 | Goku | 24 | 100 | 4.16 | 
| 5 | Piccolo | 80 | 148 | 1.85 | 
+----+---------+------+--------+------+ 
5 rows in set (0.00 sec) 

MariaDB [test]> 
MariaDB [test]> SELECT * FROM students 
    -> ORDER BY (ERRORS/Task), Task DESC; 
+----+---------+------+--------+------+ 
| id | Student | Task | Errors | Rank | 
+----+---------+------+--------+------+ 
| 3 | John | 200 | 300 | 1.5 | 
| 2 | Ria  | 100 | 150 | 1.5 | 
| 5 | Piccolo | 80 | 148 | 1.85 | 
| 4 | Goku | 24 | 100 | 4.16 | 
| 1 | Vegeta | 80 | 1500 | 18.7 | 
+----+---------+------+--------+------+ 
5 rows in set (0.00 sec) 

MariaDB [test]> 
+0

这就是排名栏上的相同值,问题是两个学生可以有相同的整体,就像John和Ria一样。 – Aramil

+1

不,如果总体排名相同,则使用子域 –

+0

的字段任务我已将结果添加到我的答案中。这不是你想要的吗? –