要求
1、高难度 SQL 试卷的得分平均值 大于80 且 用户等级为7
difficulty = "hard" and t.level = 7 and tag = 'SQL'
group by uid having avg(score)>80
2、年份要求2021,只保留有试卷完成记录的用户
如果有题目练习,没有试卷完成则不保留
思路,先找出符合条件的用户uid,再根据UID计算在2021年的答题次数
select uid , count(DISTINCT t1.id,t1.submit_time) as exam_cnt , count(distinct t2.id,year(t2.submit_time)=2021 or null) as question_cnt from user_info t left join exam_record t1 using(uid) left join practice_record t2 using(uid) where t.uid in (select uid from user_info t join exam_record using(uid) join examination_info using(exam_id) where difficulty = "hard" and t.level = 7 and tag = 'SQL' group by uid having avg(score)>80 ) and year(t1.submit_time) = 2021 group by uid order by exam_cnt, question_cnt desc
易错点:
1、在外层使用inner join 链接两个表,由于会出现有用户有答卷无练习,使用inner会漏掉没有都参加的用户
2、在外层的where中加入 year(t2.submit_time),由于答案要求只保留有试卷完成记录的用户,这里不加这个筛选,遇到没有练习记录的同学,也不会把整行数据筛掉。
可以加入year(t1.submit_time) = 2021 是因为如果有练习,无答题,这个记录是可以被过滤掉的。
3、由于多表链接,答题记录和练习记录会被合并成多行,所以在求数量的时候要进行去重处理。
关于去重的相关解释,在[[124_统计作答次数]]中有详细解答。