题解 | #统计每个学校各难度的用户平均刷题数#
统计每个学校各难度的用户平均刷题数
https://www.nowcoder.com/practice/5400df085a034f88b2e17941ab338ee8
select s1.university, s3.difficult_level, round(count(s2.question_id)/count(distinct s2.device_id),4) as avg_answer_cnt from user_profile as s1 inner join question_practice_detail as s2 on s1.device_id = s2.device_id left join question_detail as s3 on s2.question_id = s3.question_id group by university,difficult_level; /* inner join 只会匹配左右两个表条件都存在时的记录 left join 则仅根据左表存在的记录进行匹配,不管右表是否为空, ------ eg:leftjoin 连接条件为s1.device_id = s2.device_id 若s2有device_id=005的记录而s1中没有,则在连接后的复合表中不会出现005这条记录 若s1有device_id=005的记录而s2中没有,则在连接后的复合表中仍会出现005这条记录 ------ 如上题要求“统计每个学校各难度的用户平均刷题数”, s1中有device_id=4321这个设备,而在连接时s2中没有4321这个设备刷题的记录 那么若进行左连接,就会使连接后的表中仍旧出现device_id=4321,其余字段均为NULL的这条记录 后续再跟s3表左外连接时这条有空字段的记录仍旧会存在, 而题目中只让统计各个学校各难度用户的平均刷题数目,4321这个复旦大学的设备并没有刷题却仍统计进去了,最后的结果就会有无意义的行 因而只有两种连接方式 1、s1 left join s2, inner join s3 2、s1 inner join s2, left join s3 不能两个都是left join#数据SQL#