题解 | #满足条件的用户的试卷完成数和题目练习数#
满足条件的用户的试卷完成数和题目练习数
http://www.nowcoder.com/practice/5c03f761b36046649ee71f05e1ceecbf
# 高难度SQL试卷得分平均值大于80并且是7级的红名大佬
# 统计他们的2021年试卷总完成次数和题目总练习次数
# 只保留2021年有试卷完成记录的用户
select er1.uid, count(er1.submit_time) exam_cnt,
(select count(pr.submit_time)
from practice_record pr
where pr.uid=er1.uid
and year(pr.submit_time)=2021) question_cnt
from exam_record er1
where er1.uid in (select er.uid
from exam_record er inner join user_info ui
on er.uid=ui.uid
inner join examination_info ei
on er.exam_id=ei.exam_id
where ei.tag='SQL'
and ei.difficulty='hard'
and ui.level=7 and year(er.submit_time)=2021
group by uid
having avg(score)>80)
and year(submit_time)=2021
group by er1.uid
order by exam_cnt asc, question_cnt desc
思路:
- 根据题意分析条件, 条件越多, 其实越好分析
- 关键点是 uid, 我们只要知道了 uid, 就可以通过uid带出其他所有我们想要关注的uid的附属特征, 例如题中说的大佬2021年的试卷完成数, 以及其他的数据
- 所以,为了提高效率, 联结表格次数越少越好, 每一次联结都是求笛卡尔积的过程, 非常耗时
- 在where的 in 判断后 按照条件求得 uid 后
- 在select子句中用关联子查询带出 uid即可,不用再次联结