现在运营想要了解复旦大学的每个用户在8月份练习的总题目数和回答正确的题目数情况,请取出相应明细数据,对于在8月份没有练习过的用户,答题数结果返回0.
select user_profile.device_id,
university,
count(question_id) as 'question-cnt',
count(if(result='right',true,null)) as 'right_question_cnt'
from user_profile left outer join question_practice_detail
on user_profile.device_id = question_practice_detail.device_id
where university='复旦大学' and (MONTH(date)=8 || MONTH(date) is null)
group by user_profile.device_id;
这里有两个较难的知识点,一个是怎么根据结果来统计正确的题目数,另一个是考虑到在八月份没有答题的同学要怎么计算在内。 首先解决第一个问题,这里采用的同样是count函数,不过在内部加入if条件对result的值进行判断,如果是right,返回true(这里用1也可以),否则返回null,这样的话问题就解决了。 第二个问题,在where后面加入month(date)=8之后就会发现只有3214这个同学的记录,原因是4321这位同学在整个八月是没有答题记录的(这里说一下,联结的条件是以user_profile在前的左联结,这样也会保证所有的同学都在结果记录中,即使他没有答题。),所以我们要对日期进行一个修改加上一个月份为空的条件,来将没有答题的同学结果进行一个筛选。 这样解决到上述两个问题后,就能够得到查询的记录了。如果说这里有问题的话,也欢迎大家能够指出,谢谢!