查询多个课程成绩前三名的记录

count(字段),根绝字段判断为不为不空,根据字段定义,考虑要不要累加返回值,既然你引擎都返回值了,那我server层 “ +1 ”
count(id),根据id主键取值,累加返回值,也是server层 “ +1 ”
count(1),同样会遍历,但不取值,引擎告诉不为空那我就 “+1”
count(*),也不取值,而且人家还是经过优化的

https://blog.csdn.net/FeiChangWuRao/article/details/89493516

方法一 : 笛卡尔积(取 a 的最高分与本表比较)

-- 方法一 : 笛卡尔积
-- 思路:判断这个成绩是否为前三名,只要这个课程的所有成绩(最高分)和本表成绩进行比较,比a表成绩更大的记录少于三条,那么这个成绩就是前三名的
select * from tb_score a  
-- 条件 : 大于此条成绩的记录少于三条(a表的每一条记录和本表记录进行关联,关联条件就是course_id = a.course_id,本表相同课程成绩>a表相同课程分数
-- 简单说就是a的每条记录和一个表数据进行关联,)
where (select COUNT(*)from tb_score where course_id = a.course_id and score>a.score)<3
-- 排序(课程id和分数降序)
ORDER BY a.course_id, a.score desc

方法二 :

select a.*
from tb_score a 
left join tb_score b on a.course_id=b.course_id and a.score<b.score
group by a.student_id,a.course_id,a.score
having COUNT(b.student_id)<3
ORDER BY a.course_id, a.score desc
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值