SELECT tag, COUNT(tag) tag_cnt
FROM exam_record a
JOIN examination_info b
USING(exam_id)
WHERE uid in
(SELECT uid
FROM exam_record
WHERE submit_time is NOT null
GROUP BY uid
HAVING COUNT(exam_id)/COUNT(DISTINCT MONTH(start_time)) >= 3
# HAVING COUNT(exam_id)/COUNT(DISTINCT MONTH(submit_time)) >= 3
)
# AND MONTH(submit_time) = 9 # 这个是看到讨论说是求的是9月的,从结果看也不一定是
GROUP BY tag
ORDER BY tag_cnt DESC;
题解:
任务:找到试卷类别和被作答次数
限制:目标试卷是被月均完成试卷数大于等于3的用户完成的
按作答次数倒序输出
首先看要什么字段,一个tag和tag_cnt,先选择这个,第二个字段肯定是要用聚合函数的,可以用COUNT(tag)计数,后续再分组计算;
然后联结两个表,这里因为examid两个表都有,所以无所谓内外联结,联结字段就直接用using,比on方便多了;
接下来就是完成限制条件,最开始是尝试建立视图,但是警告我没有权限,折腾了半天还是用子查询了。详细理下子查询的思路:
要定位是哪些用户,所有查uid;是完成了试卷,所以要检查有没有完成(用提交时间),测试过如果是删掉就只能通过一个用例;最后筛选月均完成数,这个让人很不解,倒是是每个月都完成了3个还是平均下来每个月都完成了3个,属于是语言的艺术了。在本题中就是平均下来每个月都完成了3个,所以计算全部完成的数量再除以有几个月即可。注释掉的那个也可以执行,因为前面用where已经过滤了提交时间为null的了。
最后就是tag分组和排序了。
不容易

京公网安备 11010502036488号