MySQL Rank 并列

标签 mysql database ranking

我是 sql 的新手,我从未在 mysql 中使用过变量或条件,但从其他编程语言中知道这一点。几天以来,我试图找到一种对用户分数进行排名的方法。我阅读了很多文章,也阅读了 stackoverflow 上提出的问题,最后我找到了一个几乎可以按照我想要的方式完成的解决方案。

SELECT
  score_users.uid,
  score_users.score,
  @prev := @curr,
  @curr := score,
  @rank := IF(@prev = @curr, @rank, @rank +1) AS rank
FROM
  score_users,
  (SELECT @curr := null, @prev := null, @rank := 0) tmp_tbl
WHERE
  score_users.matchday = 1
ORDER BY
  score_users.score DESC

但我的问题是平分。我不想获得连续的排名,就像这样:

+------------+------+--------+
| uid | name  | rank | score |
+------------+------+--------+
| 4   | Jon   |   1  |  20   |
| 1   | Jane  |   2  |  19   |
| 2   | Fred  |   2  |  19   |
| 9   | July  |   3  |  18   |
| 7   | Mary  |   4  |  17   |
| 3   | Toni  |   5  |  12   |
| 5   | Steve |   5  |  12   |
| 6   | Peter |   6  |  11   |
| 8   | Nina  |   7  |  10   |
+------------+------+--------+

我想得到这样的结果:

+------------+------+--------+
| uid | name  | rank | score |
+------------+------+--------+
| 4   | Jon   |   1  |  20   |
| 1   | Jane  |   2  |  19   |
| 2   | Fred  |   2  |  19   |
| 9   | July  |   4  |  18   |
| 7   | Mary  |   5  |  17   |
| 3   | Toni  |   6  |  12   |
| 5   | Steve |   6  |  12   |
| 6   | Peter |   8  |  11   |
| 8   | Nina  |   9  |  10   |
+------------+------+--------+

我想我必须创建一个新的临时表,和一些 if 条件,但我找不到解决办法,变得绝望了! 此外,我必须密切关注性能,也许有更好的方法可以像我一样获得得分排名?如果有提示或一些代码片段,我将不胜感激。

最佳答案

您可以使用另一个变量来计算相同的排名,而不是将 @rank 递增 1,而是将 @rank 递增计数器值,如下所示:

SELECT
  score_users.uid,
  score_users.score,
  @prev := @curr,
  @curr := score,
  @rank := IF(@prev = @curr, @rank, @rank + @i) AS rank,
  IF(@prev <> score, @i:=1, @i:=@i+1) AS counter
FROM
  score_users,
  (SELECT @curr := null, @prev := null, @rank := 0, @i := 0) tmp_tbl
WHERE
  score_users.matchday = 1
ORDER BY
  score_users.score DESC

关于MySQL Rank 并列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118393/

相关文章:

mysql - Bootstrap-vue 模态 : Always Deleting the Last ID

ruby-on-rails - 如何在 ActiveRecord 事务中获得保存(无感叹号)语义?

database - 具有不同 SID 的 Oracle 导出数据库

sql - 从 2 个表中计算高分排名

javascript - 如何在表中的javascript中将时间戳转换为日期时间

java - 如何在hibernate中写left join?

sql - 什么是更快的查询(选择名称....或选择顶部(1)名称

mysql - 如何将 "top 10"列表从 SQL 转换为 NoSQL

java - [JAVA]如何创建排名系统并将其保存到.txt 文件?

mysql - 无法删除谷歌云sql复制主实例