MySQL排名与关系

Fre*_*Fus 7 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
Run Code Online (Sandbox Code Playgroud)

但我的问题是平局得分.我不希望得到连续的排名,像这样:

+------------+------+--------+
| 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   |
+------------+------+--------+
Run Code Online (Sandbox Code Playgroud)

我想得到这样的结果:

+------------+------+--------+
| 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   |
+------------+------+--------+
Run Code Online (Sandbox Code Playgroud)

我想我必须创建一个新的临时表,有些条件,但我找不到解决方案,变得绝望!此外,我必须密切关注表现,也许有更好的方法来获得我的分数排名?我会非常感谢提示或一些代码片段.

Azi*_*ikh 4

您可以使用另一个变量来计算相同的排名,这样您就可以按计数器值@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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢阿齐兹,这个效果很好。我只是在子选择中将@rank设置为1,否则排名从0开始!干杯 (2认同)