【场景】:分组后行拼接为一列
【分类】:分组查询、group_concat
分析思路
难点:
1.如何按照分组拼接?
使用group_concat
一、如何按照分组拼接
先使用concat或者concat_ws,将日期和tag拼接在一起,并加上分隔符’:‘
- [使用]:concat(date_format(start_time,'%Y-%m-%d'),':',tag)
- [使用]:concat_ws(':',date_format(start_time,'%Y-%m-%d'),tag)
再按照日期和tag拼接好的列分组拼接为一列,并加上分隔符‘;’
- [使用]:group by course_id,course_name
二、完成试卷作答数至少为1且未完成数小于5
放在having中做处理
- [使用]:having ((count(a.exam_id)-count(submit_time)) < 5 and count(submit_time) >= 1 and (count(a.exam_id)-count(submit_time)) > 1)
扩展
前往查看:MySQL 字符串拼接
求解代码
使用 group_concat concat
select
a.uid,
count(a.exam_id)-count(submit_time) as incomplete_cnt,
count(submit_time) as complete_cnt,
group_concat(distinct concat(date_format(start_time,'%Y-%m-%d'),':',tag) order by start_time Separator ';') as detail
from exam_record a,examination_info b
where b.exam_id = a.exam_id
and year(start_time) = 2021
group by uid
#完成试卷作答数至少为1且未完成数小于5
having ((count(a.exam_id)-count(submit_time)) < 5 and count(submit_time) >= 1 and (count(a.exam_id)-count(submit_time)) > 1)
order by incomplete_cnt desc
方法二:
使用 group_concat concat_ws
select
a.uid,
count(a.exam_id)-count(submit_time) as incomplete_cnt,
count(submit_time) as complete_cnt,
group_concat(distinct concat_ws(':',date_format(start_time,'%Y-%m-%d'),tag) order by start_time Separator ';') as detail
from exam_record a,examination_info b
where b.exam_id = a.exam_id
and year(start_time) = 2021
group by uid
#完成试卷作答数至少为1且未完成数小于5
having ((count(a.exam_id)-count(submit_time)) < 5 and count(submit_time) >= 1 and (count(a.exam_id)-count(submit_time)) > 1)
order by incomplete_cnt desc