题解 | #满足条件的用户的试卷完成数和题目练习数#

满足条件的用户的试卷完成数和题目练习数

http://www.nowcoder.com/practice/5c03f761b36046649ee71f05e1ceecbf

with target_user as
(#先是筛选特定的用户
select 
b.uid,
avg(b.score)
from examination_info a 
left join exam_record b on a.exam_id=b.exam_id
inner join user_info c on b.uid=c.uid and c.level=7
where a.tag='SQL' and a.difficulty='hard' 
group by b.uid
having avg(b.score)>80
)
#接下来连接三个表,因为exam_record和practice_record 的主键是id,
#所以计算次数时可以用dsitinct id
select 
c.uid,
count(distinct a.id) as exam_cnt,
count(distinct b.id) as question_cnt
from target_user c
left join exam_record a on a.uid =c.uid and year(a.submit_time)=2021 
left join practice_record b on b.uid=c.uid and year(b.submit_time)=2021
group by c.uid
order by exam_cnt,question_cnt desc


全部评论
楼主用id来识别三表连接后的不同答题记录的思路好棒啊!但是有个小小的问题,根据题意只保留2021年有试卷完成记录的用户,left join exam_record a on a.uid =c.uid and year(a.submit_time)=2021 这里应该用inner join,否则2021年没有试卷完成记录的用户也被算进去了,楼主测试通过了是因为测试用例中满足要求的用户2021年都有试卷完成记录
1 回复 分享
发布于 2022-05-03 22:59
这里的id为什么要用distinct哇,它不是本来就是唯一的吗?
点赞 回复 分享
发布于 2022-04-22 06:24
存在submit是null的时候,count(id)就不准确了,只是这道题恰好没有
1 回复 分享
发布于 2022-05-25 22:55
不是大于80吗?怎么是大于等于80?
点赞 回复 分享
发布于 2021-10-29 11:19
太牛了
点赞 回复 分享
发布于 2022-02-18 23:05
大佬 请问下这个distinct后面我不用id 用distinct submit_time 为什么运行能对 提交就错了呢
点赞 回复 分享
发布于 2022-04-07 15:43
谢谢你,学习新方法了
点赞 回复 分享
发布于 2022-05-24 15:41
如果有人只参加过考试,没有答过question,貌似会漏掉这部分人
点赞 回复 分享
发布于 2022-11-08 09:38 湖北
改了一下: WITH user AS (SELECT er.uid FROM exam_record AS er LEFT JOIN examination_info AS ei ON er.exam_id=ei.exam_id LEFT JOIN user_info AS ui ON er.uid=ui.uid WHERE ei.tag='SQL' AND ei.difficulty='hard' AND ui.level=7 GROUP BY er.uid HAVING AVG(er.score)>80) SELECT user.uid,exam_cnt,IFNULL(question_cnt,0) FROM user LEFT JOIN (SELECT uid,COUNT(*) AS exam_cnt FROM exam_record WHERE YEAR(submit_time)='2021' GROUP BY uid) AS t1 ON user.uid=t1.uid LEFT JOIN (SELECT uid,COUNT(*) AS question_cnt FROM practice_record WHERE YEAR(submit_time)='2021' GROUP BY uid) AS t2 ON user.uid=t2.uid ORDER BY exam_cnt,question_cnt DESC;
点赞 回复 分享
发布于 2022-11-30 12:32 北京
我这样子写怎么就不太行呢 with too_table as ( select er.uid, avg(score) from exam_record as er join user_info as ui using (uid) join examination_info as ei using(exam_id) where ui.level='7' and ei.tag='SQL' and ei.difficulty='hard' group by uid having avg(score)>80 ) select t1.uid, count(distinct exam_id) exam_cnt, count(distinct question_id) question_cnt from too_table as t1 left join exam_record as er using(uid) and year(er.submit_time) = '2021' left join practice_record as pr using(uid) and year(pr.submit_time) = '2021' group by t1.uid order by exam_cnt asc, question_cnt desc;
点赞 回复 分享
发布于 2024-06-13 19:41 上海
这里,第二段查询的表命名不要使用重复的a,b,c命名,引起混淆
点赞 回复 分享
发布于 02-27 10:59 广东

相关推荐

漂亮的海豚在炒股:把西电加粗
点赞 评论 收藏
分享
评论
25
5
分享

创作者周榜

更多
牛客网
牛客企业服务