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