postgres 遍历查询结果_MySQL查询,用关联子查询解决部分排名问题的方法(2)

需要有一定的MySQL基础才可以看哦~

有学生成绩表(sc)如下,三个字段分别是:s_id 学生编号,c_id 课程编号,score 考试分数

49dbccf0d7f048be61766fe9d4a0ac09.png

问题二:按各科成绩进行排序,并显示排名;

大家可以停下来想一下,要怎么才能实现?

和上篇文章的解题思路基本一致,如何确定某个成绩的名次呢?就看和这条记录课程编号一样,分数比这条记录分数高的人有几个,比如数学成绩是80分,所有数学成绩里比80分高的有5人,那这人就是第6名。

还是要先了解下mysql查询语句的运行逻辑,如下查询语句:select s_id,c_id,score from sc ;得到的结果是sc表的所有记录,那select语句里面的s_id,c_id,score是什么呢?很多人会认为就是sc表的字段,是三列数据,这个思路是错的,这里面有一个遍历的思想,from语句会遍历查询表的每一条记录,再将这条记录返回到select语句,所以select后面的s_id,c_id,score不是一列护具,而是具体的值,当from遍历第一条记录是,s_id是01,c_id是01,score是80,遍历第二条记录时...

这道题的完整代码如下:

select s_id,c_id,score,

(select sum(score>sc.score) from sc sc1 where c_id=sc.c_id)+1 排名

from sc

order by c_id,排名;

对课程编号和排名进行排序后,得到如下的结果:

768a8db195a7f1ec8e032264d0c8bec3.png

代码是在select语句用了子查询,首先外层查询是查询sc表,遍历sc表的每一条记录,遍历第一条数据是,s_id为01,c_id为01,score为80,将这条记录放到select语句后面的子查询:(select sum(score>sc.score) from sc sc1 where c_id=sc.c_id)+1,子查询也是查询sc表,为了避免和外层查询的sc表冲突,可以给子查询的sc表别名sc1,对满足条件的记录进行计数,条件是c_id=sc.c_id and score>sc.score ,这里的sc.c_id和sc.score是外层查询的第一条记录,也就是sc.c_id为01,sc.score为80,可以等价于(select sum(score>80) from sc sc1 where c_id="01")+1,求的是课程编号为01,分数大于80的人有几个,在后面+1,就是这条记录的排名。然后外层查询遍历第二条记录,遍历第三条记录,依次遍历到最后一条记录,把每一条记录的值放到select的子查询里,得到每条记录的名次。

有人可能会对sum(score>80)不太理解,score>80,得到的是逻辑值,满足就是True,不满足就是False,而MySQL里面的True是1,False是0,进行求和时,0是不参与的,也就是统计1的个数,而1代表满足条件,所以sum(score>80)求的是分数大于80的人的数量。

如有不懂的,或者有更好的方法,或者想看什么样的内容,欢迎留言交流~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值