with
temp as (
select
a.uid,
exam_id,
start_time,
submit_time,
score
from
(
select
uid,
exam_id,
start_time,
submit_time,
score
from
exam_record
union all
select
uid,
question_id exam_id,
null as start_time,
submit_time,
score
from
practice_record
) a
left join user_info b on a.uid = b.uid
where
level in (6, 7)
)
select
t3.uid,
ifnull(t1.act_month_total,0) act_month_total,
ifnull(t2.act_days_2021,0) act_days_2021,
ifnull(t2.act_days_2021_exam,0) act_days_2021_exam,
ifnull(t2.act_days_2021_question,0) act_days_2021_question
from
# select * from
(
select distinct uid
from user_info
where level in(6,7)) t3
left join
(
select
uid,
count(distinct left (submit_time, 7)) act_month_total
from
temp
group by
uid
) t1 on t3.uid = t1.uid
left join (
select
x.uid,
count(distinct date (submit_time)) act_days_2021,
count(distinct date (9_sub)) act_days_2021_exam,
count(distinct date (8_sub)) act_days_2021_question
from
(
select
uid,
submit_time,
if (left (exam_id, 1) = 9, submit_time, null) as 9_sub,
if (left (exam_id, 1) = 8, submit_time, null) as 8_sub
from
temp
)x
where
year (submit_time) = 2021
group by
uid
) t2 on t1.uid = t2.uid
order by
act_month_total desc,
act_days_2021 desc