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