拖延症害死锅

MySQL查询结果显示行号
发表于2018-08-09 17:28:45 | 分类:技术 | 阅读:109

投票活动中,排行榜需要根据票数从大到小进行排名并显示选手的名次。记录所有问题及解决方法。


以‘player’这个表(共三个字段:id主键;name姓名;vote_num票数)为例:


状况1:按票数从大到小排序并显示名次


  SELECT p.*,@rank:=@rank+1 as rank FROM player p,(select @rank:=0) r ORDER BY vote_num DESC


结果:


1.png


说明:声明变量@rank并赋值为0,查询变量成表别名为r,相当于两个表结合,player表中取出一条数据,r表与之结合,每次累加1,形成行号。


状况2:排行榜使用下拉加载更多的效果,相当于给排行榜分页,需要limit分割


  //第一页
  SELECT p.*,@rank:=@rank+1 as rank FROM player p,(select @rank:=0) r ORDER BY vote_num DESC LIMIT 0,2
  //第二页
  SELECT p.*,@rank:=@rank+1 as rank FROM player p,(select @rank:=0) r ORDER BY vote_num DESC LIMIT 2,2


结果:


2.png

3.png


说明:行号是根据被分割的数据块从1开始递增的,导致第二页数据排名出错。


解决方法:


   SELECT * FROM(SELECT p.*,@rank:=@rank+1 as rank FROM player p,(select @rank:=0) r ORDER BY vote_num DESC) a LIMIT 2,2


4.png


说明:使用嵌套查询,对进行过排序的表进行分割。


扩展:使用视图查询


具体操作:使用Navicat for MySQL软件为例,新建视图,在定义中填写并保存。


注意:不能直接在定义中,填写状况1的语句,因为定义中不能有变量。


6.png


   SELECT
   q.id,
   q.`name`,
   q.vote_num,
   (SELECT COUNT(0)+1 FROM player p WHERE q.vote_num<p.vote_num) AS rank
   FROM
   player q
   ORDER BY q.vote_num DESC


结果:


5.png


说明:查询结果中的行号是取出一个票数数据与表中所有票数相比较,如果没有人比它大,统计为0,排名第1,如果有其它一个数据比它大,统计为1,排名为第2,同理得到所有统计数字和名次。为了友好显示效果,统计数字+1=名次;

剩下就可以通过查询视图方式,分割数据,名次就能正确显示。


打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
点击此处,取消分享
*以下内容皆为必填项目

0条评论

暂无评论
TOP