题解 | #满足条件的用户的试卷完成数和题目练习数#

满足条件的用户的试卷完成数和题目练习数

https://www.nowcoder.com/practice/5c03f761b36046649ee71f05e1ceecbf

#高难度SQL试卷得分平均值大于80并且是7级红名大佬
#2021年试卷总完成次数exam_cnt和题目总练习次数question_cnt
#只保留2021年有试卷完成记录的用户
#试卷完成数升序,题目练习数降序
select er.uid, count(distinct er.exam_id) exam_cnt, count(distinct pr.id) question_cnt
from exam_record er 
left join practice_record pr on er.uid = pr.uid
and year(er.submit_time) = 2021
and year(pr.submit_time) = 2021
where er.uid in(
    select er.uid
    from exam_record er    
    left join examination_info ei on er.exam_id = ei.exam_id
    left join user_info ui on er.uid = ui.uid
    where level = 7 and tag = 'SQL' and difficulty = 'hard'
    group by er.uid
    having avg(score) >= 80 
)
group by er.uid
order by exam_cnt asc, question_cnt desc;


错误代码:
select er.uid, count(distinct er.exam_id) exam_cnt, count(distinct pr.id) question_cnt
from exam_record er 
left join practice_record pr on er.uid = pr.uid
where er.uid in(
    select er.uid
    from exam_record er    
    left join examination_info ei on er.exam_id = ei.exam_id
    left join user_info ui on er.uid = ui.uid
    where level = 7 and tag = 'SQL' and difficulty = 'hard'
    group by er.uid
    having avg(score) >= 80 
)
and year(er.submit_time) = 2021
and year(pr.submit_time) = 2021
group by er.uid
order by exam_cnt asc, question_cnt desc;

原因:
on和where的执行顺序不同。
from->where->group by->having->select->order by->limit
left join 是在from范围类所以 先on条件筛选表,然后两表再做left join。
而对于where来说在left join结果再次筛选。

on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。

全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务