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

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

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

-- 题目的坑是两次连续的left join,导致前一次左连接的整体再与下一个表左连接时,/
-- 若下一张表有多条记录能与第一张表的主键相关联,那么上两张表左关联的结果在与下一张表关联时 /
-- 记录会翻倍,最终导致第二张表的次数统计有误 /
-- 类似的,一二两张表的关联结果也会影响第三张表。
select 
    b1.uid,
    b1.exam_cnt,
    b2.question_cnt
from (
    select 
        a1.uid,
        count(a2.exam_id) exam_cnt
    from (    
        select 
            t3.uid
        from (
            select exam_id from examination_info where tag = 'SQL' and difficulty = 'hard'
        ) t1
        inner join (
            select uid,exam_id,score from exam_record
        ) t2
        on t1.exam_id = t2.exam_id
        inner join (
            select uid from user_info where level = 7
        ) t3
        on t2.uid = t3.uid
        group by t3.uid
        having avg(t2.score) >= 80
    ) a1
    left join (
        select uid,exam_id from exam_record where submit_time >= '2021-01-01 00:00:00' and submit_time <= '2021-12-31 23:59:59'
    ) a2 
    on a1.uid = a2.uid
    group by a1.uid
) b1
-- 需要分开单独进行两次左关联,并把次数统计出来;最后进行内连接将两个统计结果拼接
inner join (
    select 
        a1.uid,
        count(a2.question_id) question_cnt
    from (    
        select 
            t3.uid
        from (
            select exam_id from examination_info where tag = 'SQL' and difficulty = 'hard'
        ) t1
        inner join (
            select uid,exam_id,score from exam_record
        ) t2
        on t1.exam_id = t2.exam_id
        inner join (
            select uid from user_info where level = 7
        ) t3
        on t2.uid = t3.uid
        group by t3.uid
        having avg(t2.score) >= 80
    ) a1
    left join (
        select uid,question_id from practice_record where submit_time >= '2021-01-01 00:00:00' and submit_time <= '2021-12-31 23:59:59'
    ) a2
    on a1.uid = a2.uid
    group by a1.uid
) b2
on b1.uid = b2.uid 
order by b1.exam_cnt, b2.question_cnt desc ;

全部评论

相关推荐

05-09 14:45
门头沟学院 Java
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务