说明:查询分数排名前三的同学及分数信息。
表结构
user
表
score
表
结果
SQL 语句
1. 常规方法
使用临时变量计算排名相关信息。
prescore
用于记录上一次的分数,用于比较是不是同名词。
r
用于记录排名。
c
用于记录同名次排名产生的计数差值。
SELECT `user`.id, `user`.`name`,v.score, v.Ran
FROM `user`,
(
SELECT user_id,score,
@r := IF( @prescore = score, @r, @r + @c + 1) AS Ran,
@c := IF( @prescore = score, @c + 1, 0) AS cc,
@prescore := score.score
FROM score,
( SELECT @prescore := NULL, @r := 0, @c := 0 ) rv
ORDER BY score DESC
) v
WHERE `user`.id = v.user_id
AND v.Ran < 4
2. 使用 Mysql RANK()函数
RANK() 函数简介
RANK()
函数为结果集的分区中的每一行分配一个排名。行的等级由一加上前面的等级数指定。
以下显示了RANK()
函数的语法:
RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)
在这个语法中:
- 首先,
PARTITION BY
子句将结果集划分为分区。RANK()
功能在分区内执行,并在跨越分区边界时重新初始化。 - 其次,
ORDER BY
子句按一个或多个列或表达式对分区内的行进行排序。
与ROW_NUMBER()
函数不同,RANK()
函数并不总是返回连续的整数。
SQL
SELECT
*
FROM
(
SELECT
`user`.id,
`user`.`name`,
score.score,
RANK() over ( ORDER BY score.score DESC ) AS ran
FROM
score,
`user`
WHERE
`user`.id = score.user_id
) v
WHERE
v.ran < 4