mysql实现Oracle 的rank() over()函数

之前要查询排序且有排名,如果是oracle的话有rank() over()函数,但是mysql没有这样的函数,只能自己试着用变量实现

表结构:

mysql实现Oracle 的rank() over()函数

SELECT id,

score ,

@rank := @rank + 1 AS rank

FROM a, (SELECT @rank := 0) tmp

ORDER BY score desc ;


mysql实现Oracle 的rank() over()函数

不过这样有一个问题如果同时有两个99分rank也会顺序的排序

mysql实现Oracle 的rank() over()函数

我想到的临时解决办法就是内层进行一次group by,仅算出分数的排名,再用分数与a表匹配

sql代码:

SELECT a.id,a.score,b.rank from a,(

SELECT a.score ,

@rank := @rank + 1 AS rank

FROM (SELECT score from a GROUP BY score) a, (SELECT @rank := 0) tmp

ORDER BY score desc

) b

where a.score = b.score

ORDER BY b.rank;

mysql实现Oracle 的rank() over()函数


不知道有没有更好的解决办法,如果不正确希望指点