1、新知识点 group_concat([distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符']) ,相当于根据group by指定的同一组就把所选内容组合到一起
2、计划完成数和未完成数,考虑到的函数是count和sum,其中未完成数不能用count(*)-count(submit_time)完成,所以换为sum函数,建议优先选择sum函数
3、未完成数大于1且小于5,等于between 2 and 4,有两种表达方式
4|降序用order by ... desc

select 
uid,
sum(if(submit_time is null,1,0) ) incomplete_cnt,
Count(submit_time) complete_cnt,
group_concat(distinct CONCAT(DATE_FORMAT(er.start_time, '%Y-%m-%d'),':',ei.tag) separator ';')detail
from exam_record er
join examination_info ei
using(exam_id)
where year(start_time)=2021
group by uid
having Count(submit_time) >= 1
and sum(if(submit_time is null,1,0) ) between 2 and 4
order by incomplete_cnt desc