SELECT
    ui.uid uid,
    IF (c.act_month_total IS NULL, 0, c.act_month_total) act_month_total,
    IF (pp.act_days_2021 IS NULL, 0, pp.act_days_2021) act_days_2021,
    IF (
        b.act_days_2021_exam IS NULL,
        0,
        b.act_days_2021_exam
    ) act_days_2021_exam,
    IF (
        a.act_days_2021_question IS NULL,
        0,
        a.act_days_2021_question
    ) act_days_2021_question
FROM
    user_info ui
    LEFT JOIN (
        SELECT
            count(act_days_2021) act_days_2021,
            uid
        from
            (
                SELECT
                    uid,
                    DATE_FORMAT (submit_time, '%Y%m%d') act_days_2021
                FROM
                    practice_record
                WHERE
                    score IS NOT NULL
                    AND YEAR (submit_time) = '2021'
                UNION
                SELECT
                    uid,
                    DATE_FORMAT (submit_time, '%Y%m%d') act_days_2021
                FROM
                    exam_record
                WHERE
                    score IS NOT NULL
                    AND YEAR (submit_time) = '2021'
            ) jb
        GROUP BY
            uid
    ) pp on pp.uid = ui.uid
    LEFT JOIN (
        SELECT
            uid,
            count(DISTINCT DATE_FORMAT (submit_time, '%Y%m%d')) act_days_2021_question
        FROM
            practice_record
        WHERE
            score IS NOT NULL
            AND YEAR (submit_time) = '2021'
        GROUP BY
            uid
    ) a ON a.uid = ui.uid
    LEFT JOIN (
        SELECT
            uid,
            count(DISTINCT DATE_FORMAT (submit_time, '%Y%m%d')) act_days_2021_exam
        FROM
            exam_record
        WHERE
            score IS NOT NULL
            AND YEAR (submit_time) = '2021'
        GROUP BY
            uid
    ) b ON b.uid = ui.uid
    LEFT JOIN (
        SELECT
            count(DISTINCT act_month) act_month_total,
            uid
        FROM
            (
                SELECT
                    DATE_FORMAT (start_time, '%Y%m') act_month,
                    uid
                FROM
                    exam_record
                WHERE
                    score IS NOT NULL
                UNION
                (
                    SELECT
                        DATE_FORMAT (submit_time, '%Y%m') act_month,
                        uid
                    FROM
                        practice_record
                    WHERE
                        score IS NOT NULL
                )
            ) tmp
        GROUP BY
            uid
    ) c ON c.uid = ui.uid
WHERE
    ui.LEVEL IN (6, 7)
ORDER BY
    act_month_total DESC,
    act_days_2021 DESC