我在数据库中有特定科目的学生考试成绩。学生将接受考试,他们可能会得到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
递增,具有相同分数的用户将获得与pae
和yanier
的示例两者都必须获得2
和3
的分数,而不仅仅是2
。
所以,总而言之,我如何为每个用户提供相当数量的排名
答案 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。