Stay hungry, Stay foolish

0%

[mysql]返回记录的ROWNUM

ROWNUM是记录行数。有时候我们需要在查询某条记录并得到这条记录在其查询结果中是第几条。这样说可以会让看官迷糊,以我接触到的业务来说一下吧:

我需要建一个排行榜,这是没有问题的,只要根据某一条条件进行排序,一个排行榜就出来了。但是这个排行榜还需要一个搜索功能,搜索出某一用户并显示他的排行。

分析一下这个问题:排行榜是实时变化着的,我不可以以某一字段来进行存储,而且数据库基于主-从结构,据说用临时表也不太现实。我就把希望寄托在了ROWNUM上了。Oracle,SQL Server里都有这个,遗憾的是Mysql里没有。但是我们有办法来实现的,不是吗?

1
2
3
set @rownum = 0;

select (@rownum := @rownum + 1) as rownum, name, scores from user order by scores;

利用一个变量作为计数器,就把这个rownum给模拟出来了。再对这个查询结果进行搜索就可以得到想要的了:

1
2

select rownum, name, scores from (select (@rownum := @rownum + 1) as rownum, name, scores from user order by scores) where name = '张三';

这样貌似可以了。但是我的问题还没完:我们项目里的数据库类无法实现同时执行两条SQL语句。开始我试着改那个类,后来我换了个想法:能不能把这两条SQL语句给整合成一条呢?

在overflow上找到了这个问题的解答:

1
select rownum, name, scores from (select (@rownum := @rownum + 1) as rownum, name, scores from user u,<span style="color: #ff00ff;"> (select @rownum := 0) r </span>order by scores) where name = '张三';

参考资料

《Mysql中的ROWNUM的实现》:介绍了四种实现方法,并给出了效率的比较。

《ROW_NUMBER() in MySQL》:overflow上的一个提问,热心回答的朋友把两条SQL整合成一条。

据说打赏我的人,代码没有BUG