【分类】:嵌套子查询、多表连接
分析思路
难点:
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