思路

这是一个看上去很难的题目:

高难度SQL试卷得分平均值大于80并且是7级的红名大佬,统计他们的2021年试卷完成数和题目练习数,只保留2021年有试卷完成记录的用户。结果按试卷完成数升序,按题目练习数降序。

要求一堆,所以我们来分解一下:

1.高难度SQL试卷得分平均值大于80并且是7级

2.2021年试卷完成数和题目练习数

3.试卷完成数升序,按题目练习数降序

其实一共就这么多

1是uid in 所以我们可以放后边考虑,3一个orderby 完事,首先来看看**2 **

2在题目上还要求只保留2021年有试卷完成记录的用户但是计数2021年试卷完成数和题目练习数不就把该筛选的筛出去了?所以我们直接

2.1试卷完成数

select
    e_r.uid,
    sum(if(year(e_r.submit_time)=2021,1,0)) exam_cnt
from exam_record e_r
group by e_r.uid

是2021年的置1,否则置零让然后求和,如法炮制

2.2题目练习数

select
   p_r.uid,
   sum(if(year(p_r.submit_time)=2021,1,0)) question_cnt
from practice_record p_r
group by p_r.uid

或者

2. 2021年试卷完成数和题目练习数

select e_r.uid  uid,
       count(distinct e_r.exam_id)  exam_cnt,
       count(distinct p_r.id)  question_cnt
from 
     exam_record e_r
left join 
    practice_record p_r
on 
    e_r.uid=p_r.uid 
    and year(e_r.submit_time)=2021 
    and year(p_r.submit_time)=2021

直接筛出来2021 然后去重数人头。

1.1 7级大佬

select
   uid
from
   user_info u_i
WHERE
       level = 7

1.2 8分 SQL hard

SELECT
 e_r.uid
FROM
 exam_record e_r
     LEFT JOIN
 examination_info e_i
 on
  e_r.exam_id = e_i.exam_id
where
     difficulty = 'hard'and
     tag = 'SQL'
group by
 e_r.uid
HAVING
     avg(score)>80

1.1+1.2高难度SQL试卷得分平均值大于80并且是7级

select 
           e_r.uid
    from 
         exam_record e_r
    left join examination_info e_i
    on 
        e_r.exam_id = e_i.exam_id
    left join user_info ui
    on 
        e_r.uid = ui.uid
    where 
          tag='SQL' and difficulty='hard'
          and level = 7
    group by 
        e_r.uid
    having avg(score) > 80

1+2+3 就是通过代码

select
       exam.uid,
       exam_cnt,
       ifnull(question_cnt,0) question_cnt
from (select
          e_r.uid,
          sum(if(year(e_r.submit_time)=2021,1,0)) exam_cnt
      from exam_record e_r
      group by e_r.uid) exam
left join (select
               p_r.uid,
               sum(if(year(p_r.submit_time)=2021,1,0)) question_cnt
           from practice_record p_r
           group by p_r.uid) que
on exam.uid = que.uid
where exam.uid in (
    select
        seven.uid
    from (
             #7级大佬
             select
                 uid
             from
                 user_info u_i
             WHERE
                     level = 7
         ) seven
             join
         (
#高难度 tag = ‘sql‘ avg>80
             SELECT
                 e_r.uid
             FROM
                 exam_record e_r
                     LEFT JOIN
                 examination_info e_i
                 on
                         e_r.exam_id = e_i.exam_id
             where
                     difficulty = 'hard'and
                     tag = 'SQL'
             group by
                 e_r.uid
             HAVING
                     avg(score)>80
         ) tag
         on
                 tag.uid = seven.uid
    )
order by
    exam_cnt,question_cnt desc ;

或者

select e_r.uid  uid,
       count(distinct e_r.exam_id)  exam_cnt,
       count(distinct p_r.id)  question_cnt
from 
     exam_record e_r
left join 
    practice_record p_r
on 
    e_r.uid=p_r.uid 
    and year(e_r.submit_time)=2021 
    and year(p_r.submit_time)=2021
where e_r.uid in(
    select 
           e_r.uid
    from 
         exam_record e_r
    left join examination_info e_i
    on 
        e_r.exam_id = e_i.exam_id
    left join user_info ui
    on 
        e_r.uid = ui.uid
    where 
          tag='SQL' and difficulty='hard'
          and level = 7
    group by 
        e_r.uid
    having avg(score) > 80
)
group by 
    e_r.uid
order by 
    exam_cnt,question_cnt desc