我是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条件,但是我找不到解决方案,变得绝望了! 另外,我还要关注性能,也许有更好的方法来获取分数排名,比如我现在做的这种方式?如果您能给我一些提示或者代码片段,我将非常感激。