mysql-rank

MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> select * from score;
+----+-------+
| id | score |
+----+-------+
| 1 | 66 |
| 2 | 80 |
| 3 | 90 |
| 4 | 88 |
| 5 | 89 |
| 6 | 60 |
| 7 | 90 |
| 8 | 99 |
| 9 | 98 |
+----+-------+
9 rows in set (0.00 sec)

排序后的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
+-------+------+
| Score | Rank |
+-------+------+
| 99 | 1 |
| 98 | 2 |
| 90 | 3 |
| 90 | 3 |
| 89 | 4 |
| 88 | 5 |
| 80 | 6 |
| 66 | 7 |
| 60 | 8 |
+-------+------+
9 rows in set (0.00 sec)

方案一

1
2
3
4
5
6
7
SELECT
Score,
@rank := @rank + (@prev <> (@prev := Score)) Rank
FROM
Scores,
(SELECT @rank := 0, @prev := -1) init
ORDER BY Score desc

方案二

1
2
3
4
5
SELECT
Score,
(SELECT count(distinct Score) FROM Scores WHERE Score >= s.Score) Rank
FROM Scores s
ORDER BY Score desc

方案三

1
2
3
4
5
SELECT
Score,
(SELECT count(*) FROM (SELECT distinct Score s FROM Scores) tmp WHERE s >= Score) Rank
FROM Scores
ORDER BY Score desc

方案四

1
2
3
4
SELECT s.Score, count(distinct t.score) Rank
FROM Scores s JOIN Scores t ON s.Score <= t.score
GROUP BY s.Id
ORDER BY s.Score desc