SELECT
  uid,
  COUNT(incomplete) incomplete_cnt,
  COUNT(complete) complete_cnt,
  GROUP_CONCAT(
    DISTINCT CONCAT_WS(':', DATE(start_time), tag) SEPARATOR ';'
  ) detail
FROM
  (
    SELECT
      er.uid uid,
      ei.tag tag,
      er.start_time start_time,
      IF(submit_time IS NULL, 1, NULL) incomplete,
      IF(submit_time IS NULL, NULL, 1) complete
    FROM
      exam_record er
      INNER JOIN examination_info ei ON er.exam_id = ei.exam_id
    WHERE
      YEAR(start_time) = 2021
  ) tb
GROUP BY
  uid
HAVING
  complete_cnt >= 1
  AND incomplete_cnt BETWEEN 2 AND 4
ORDER BY
  incomplete_cnt DESC;