使用不同的结果对1st ...以后的记录进行排名

时间:2015-11-26 18:41:16

标签: python mysql python-3.x mysql-python

我在数据库中有特定科目的学生考试成绩。学生将接受考试,他们可能会得到0分 - 超过100分。

我希望rank学生根据他们的分数。这是简单的得分。

MariaDB [phpa]> select id, name, score FROM users WHERE id < 10;
+----+---------------+-------+---------+-
| id | name          | score |  rank   | 
+----+---------------+-------+---------+-
|  1 | yngiid        |    97 |         | 
|  2 | viyrp         |   217 |         | 
|  3 | pae           |   599 |         | 
|  4 | spohl         |   284 |         | 
|  5 | shl           |   295 |         | 
|  6 | okeer         |    73 |         | 
|  7 | jmaany        |   657 |         | 
|  8 | hxt           |    80 |         | 
|  9 | yanier        |   599 |         | 
+----+---------------+-------+---------+-

我的预期输出是等级

+----+---------------+-------+---------+-
| id | name          | score |  rank   | 
+----+---------------+-------+---------+-
|  7 | jmaany        |   657 |   1     | 
|  3 | pae           |   599 |   2     | 
|  9 | yanier        |   599 |   2     | 
|  5 | shl           |   295 |   3     | 
|  4 | spohl         |   284 |   4     | 
|  2 | viyrp         |   217 |   5     |         
|  1 | yngiid        |    97 |   6     | 
|  8 | hxt           |    80 |   7     |     
|  6 | okeer         |    73 |   8     | 
+----+---------------+-------+---------+-

现在,我所需要的只是等级从1到9但是基于得分。得分越高,排名越低。如在jmaay中将获得1而okeer将为9.

为了达到这个目的,我尝试做了类似的事情

get = conn.query("SELECT name, score FROM users GROUP BY score ORDER BY score DESC")
users = get.fetchall()

rank = 0
for user in users:
   rank += 1
   conn.prepare("UPDATE users SET rank = %s WHERE name = %s", rank, user[0])

以上将根据分数对用户进行迭代,并从1开始对其进行排名。但问题是,由于每个循环上i递增,具有相同分数的用户将获得与paeyanier的示例两者都必须获得23的分数,而不仅仅是2

所以,总而言之,我如何为每个用户提供相当数量的排名

1 个答案:

答案 0 :(得分:0)

我认为你需要这样的东西:

SET @prev_value = NULL;
SET @rank_count = 0;
SELECT id, name, score, CASE
    WHEN @prev_value = score THEN @rank_count
    WHEN @prev_value := score THEN @rank_count := @rank_count + 1
END AS rank
FROM users
ORDER BY score DESC

可以找到原始答案here