【分类】:嵌套子查询、多表连接

分析思路

难点:

1.实现with子句、from子查询和in子查询时,先查询试卷类型还是用户?

(1)统计SQL类别试卷发布后,当天有作答记录的试卷

  • [条件]:where date_format(release_time,'%Y%m%d') = date_format(submit_time,'%Y%m%d') and tag = 'SQL'

(2)统计SQL类别试卷发布后,当天有作答记录的试卷对应的5级以上的用户

  • [条件]:where level>5

(3)统计每张SQL类别试卷发布后,当天5级以上的用户作答的人数uv和平均分avg_score,按人数降序,相同人数的按平均分升序

  • [使用]:group by exam_id;order by uv desc,avg_score

最终结果

select 查询结果 [试卷ID;作答人数;平均成绩]
from 从哪张表中查询数据[多个join连接的表]
where 查询条件 [SQL类别试卷;发布当天的5级用户]
group by 分组条件 [试卷ID]
order by 对查询结果排序 [按人数降序、相同人数的按平均分升序];

扩展

前往查看:MySQL 嵌套子查询 with子句 from子查询 in子查询 join子查询

求解代码

方法一:

  • with 子查询
with
    main as(
        #统计每张SQL类别试卷发布后,当天5级以上的用户作答的记录
        select 
            uid,
            exam_id,
            score
        from examination_info
        join exam_record using(exam_id)
        join user_info using(uid)
        where date_format(release_time,'%Y%m%d') = date_format(submit_time,'%Y%m%d')
        and tag = 'SQL'
        and level > 5
    )
#统计满足条件的作答的人数uv和平均分avg_score,按人数降序,相同人数的按平均分升序
select 
    exam_id,
    count(distinct uid) as uv,
    round(avg(score),1) as avg_score
from main
group by exam_id
order by uv desc,avg_score;

方法二:

in 子查询

#统计满足条件的作答的人数uv和平均分avg_score,按人数降序,相同人数的按平均分升序
select
    exam_id,
    count(distinct uid) as uv,
    round(avg(score),1) as avg_score
from exam_record
where uid in(
    #统计SQL类别试卷发布后,当天有作答记录的试卷对应的5级以上的用户
    select
        uid
    from user_info
    where level > 5
    and exam_id in(
        #统计SQL类别试卷发布后,当天有作答记录的试卷
        select
            exam_id
        from examination_info
        join exam_record using(exam_id)
        where date_format(release_time,'%Y%m%d') = date_format(submit_time,'%Y%m%d') and tag = 'SQL'
        )  
    )
group by exam_id
order by uv desc,avg_score;

方法三:

多表连接

select
    exam_id,
    count(distinct uid) as uv,
    round(avg(score),1) as avg_score
from exam_record
join user_info using(uid)
join examination_info using(exam_id)
where tag = 'SQL'
and date_format(release_time, '%Y%m%d') = date_format(start_time, '%Y%m%d') 
and level > 5
group by exam_id
order by uv desc,avg_score