先上完整代码:

SELECT
    uid,
    count(start_time) - count(submit_time) incomplete_cnt,
    count(submit_time) complete_cnt,
    group_concat(distinct CONCAT(date(start_time),':',tag) SEPARATOR ';') detail
FROM
    exam_record e_r
        LEFT JOIN
    examination_info e_i
    ON
            e_r.exam_id = e_i.exam_id
WHERE
        year(start_time) = 2021
GROUP BY
    uid
HAVING
        incomplete_cnt between 2 and 4
   and
        complete_cnt >= 1
order by incomplete_cnt DESC

新知识时间:

group_concat

group_concat(列名,separator‘;’)//将列数据全并入一行并以:隔开

旧知识时间:

concat(列1,‘分隔符’,列2)//连接

between [ ]闭区间

count 计数时自动忽略null值

having 分组后筛选