题解 | #未完成试卷数大于1的有效用户#
未完成试卷数大于1的有效用户
https://www.nowcoder.com/practice/46cb7a33f7204f3ba7f6536d2fc04286
having和select的执行顺序
having的执行顺序在select之前,所以having最好还是不要使用别名。
但是在mysql当中支持在having使用别名,但是最好不要用。这里用了是怕看走眼
使用group_concat()来计算detail列
group_concat(distinct concat_ws(':', date(start_time), tag) separator ';')
是一个复杂的SQL表达式,用于将特定列的值组合成一个字符串,并在不同值之间使用分隔符。
- date(start_time): 这部分是一个日期函数,用于从 start_time 列中提取日期部分。
- concat_ws(':', date(start_time), tag): 这是一个字符串拼接函数。它将两个或多个字符串连接在一起,使用冒号 ":" 作为分隔符。在这里,它将日期和tag两个值连接起来,中间用冒号分隔。
- distinct: 这是一个关键字,确保在最终的结果中不会包含重复的值。如果有多个行具有相同的连接结果,只会保留一个。
- group_concat(...):这是一个聚合函数,用于将分组内的值连接成一个字符串。在这里,它将distinct concat_ws(...)的结果连接在一起。
- separator ';': 这是用于指定连接后的字符串中不同值之间的分隔符。在这里,分隔符是分号 ";"。
综合起来,group_concat(distinct concat_ws(':', date(start_time), tag) separator ';')
的作用是将不同的日期和标签组合成一个字符串,确保没有重复的组合
select er.uid, sum(if(submit_time is null,1,0)) as incomplete_cnt, sum(if(submit_time is not null,1,0)) as complete_cnt, group_concat(distinct concat_ws(':',date(start_time),tag) separator ';') as detail from exam_record er left join examination_info ei on er.exam_id = ei.exam_id where year(start_time)=2021 group by er.uid having complete_cnt>=1 and incomplete_cnt<5 and incomplete_cnt>1 order by incomplete_cnt desc;