之前要查询排序且有排名,如果是oracle的话有rank() over()函数,但是mysql没有这样的函数,只能自己试着用变量实现
表结构:
![](https://i-blog.csdnimg.cn/blog_migrate/9e16db915c0e1aa769dae7b95d42c807.png)
SELECT id,
score ,
@rank := @rank + 1 AS rank
FROM a, (SELECT @rank := 0) tmp
ORDER BY score desc ;
![](https://i-blog.csdnimg.cn/blog_migrate/d39d174cfaf3842b90165f8364fc2513.png)
不过这样有一个问题如果同时有两个99分rank也会顺序的排序
![](https://i-blog.csdnimg.cn/blog_migrate/4724c4f9669ac951b7f57f216e97184c.png)
我想到的临时解决办法就是内层进行一次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;
![](https://i-blog.csdnimg.cn/blog_migrate/6d38e55aea6bf74ff7ab47f580394add.png)
不知道有没有更好的解决办法,如果不正确希望指点