最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

MySQL并列排名和顺序排名查询

来源:懂视网 责编:小采 时间:2020-11-09 08:33:51
文档

MySQL并列排名和顺序排名查询

MySQL并列排名和顺序排名查询:准备。创建一张叫scores的表,内容如下。因为测试排名,所以就用最简单的结构。idscore199280387460580699需求。获取分数排名,要求并列排名。如果两个分数相同,则两个分数排名(rank)相同。名次之间不应该有间隔。结果如下。idscorerank1
推荐度:
导读MySQL并列排名和顺序排名查询:准备。创建一张叫scores的表,内容如下。因为测试排名,所以就用最简单的结构。idscore199280387460580699需求。获取分数排名,要求并列排名。如果两个分数相同,则两个分数排名(rank)相同。名次之间不应该有间隔。结果如下。idscorerank1

准备。

创建一张叫scores的表,内容如下。因为测试排名,所以就用最简单的结构。
idscore
199
280
387
460
580
699

需求。

获取分数排名,要求并列排名。如果两个分数相同,则两个分数排名(rank)相同。名次之间不应该有“间隔”。

结果如下。

idscorerank
1991
6991
3872
2803
5803
4604

sql语句

select id, score, (select count(distinct(score)) from scores as b where b.score > a.score ) + 1 as rank from scores as a order by rank;
先把结果拿出来,然后再分析怎么思考这个问题。这里的查询关键字我都没有大写,个人习惯!应该是要大写的。

分析。

按照上面的需求,我们可以知道我们是要做一个按照分数(score)查询的一个功能,只不过是要给排序好的结果加上一个我们想要的名次。
我们笨想,我们要想知道某个分数排第几名,是不是知道有几个比它大就行了。如果有零个比它大的,那么它就是第一名,如果只有一个比它大,
那么它就是第二名。以此类推就好了。
那么我们来分析上面的sql语句。它就是把socres表分成了俩个一样的表,a 表,b表。然后通过子查询去查rank的值。
第一步:select id,score, rank from scores order by rank;我们查询我们要的信息,但是我们scores表中没有rank这个字段,所以就要分成俩个一
 样的表,做子查询,来查rank。
第二步:select id,score,(select count(score) from scores as b where b.score > a.score) + 1 as rank from scores as a order by rank;上面说过了
 如果0个比某分数大,那么它就是第一名。所以我们要再查询的个数上加1。结果如下:

SB4v2HuAmd.jpg

我们发现结果不是我们预期的。因为我们还没有去重。比87大的有俩个都是99,那么87的rank就是2+1=3,而我们要的排名连续不断的。所以用distinct
关键字去重。
第三步:select id, score, (select count(distinct(score)) from scores as b where b.score > a.score ) + 1 as rank from scores as a order by rank;

Snipaste_2019-07-01_17-03-55.png

顺序排名预期结果

Snipaste_2019-07-01_17-05-07.png

顺序排名我们就按照score字段倒序查询即可,只不过是用msyql的变量去做rank。mysql中的变量是用‘@’跟上变量名称。@rowNum 
php中我们用$rowNum。mysql中赋值用 := 来赋值。(select @rowNum :=0) r 是给变量@rowNum一个初始值为0。这个很好理解。就是
按照我们要排名的字段倒序去查询,再用mysql变量给每一条结果加一个排列序号。

sql语句

select t.id, t.score,@rowNum := @rowNum +1 as rank from (select @rowNum :=0) r, scores as t order by t.score desc ;

结果

Snipaste_2019-07-01_17-05-54.png

更多SQL的相关技术文章,请访问SQL教程栏目进行学习!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

MySQL并列排名和顺序排名查询

MySQL并列排名和顺序排名查询:准备。创建一张叫scores的表,内容如下。因为测试排名,所以就用最简单的结构。idscore199280387460580699需求。获取分数排名,要求并列排名。如果两个分数相同,则两个分数排名(rank)相同。名次之间不应该有间隔。结果如下。idscorerank1
推荐度:
标签: 查询 排名 mysql
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top