# 两次连表 SELECT uid, exam_cnt, IFNULL(question_cnt,0) question_cnt FROM( # 统计不同用户的试卷完成数,2021年没有记录的直接筛掉 SELECT uid,COUNT(DISTINCT exam_id) exam_cnt FROM exam_record WHERE YEAR(start_time) = 2021 GROUP BY uid ) t1 # 左连接 LEFT JOIN( # 统计不同用户的题目总练习次数,注意不用DISTINCT去重 SELECT uid,COUNT(question_id) question_cnt FROM practice_record WHERE YEAR(submit_time) = 2021 GROUP BY uid ) t2 USING(uid) # 内连接,起到筛选作用 INNER JOIN( # 找到符合条件的用户id SELECT uid, AVG(score) avg_score FROM user_info INNER JOIN exam_record USING(uid) INNER JOIN examination_info USING(exam_id) WHERE tag='SQL' AND difficulty='hard' AND level=7 GROUP BY uid HAVING avg_score > 80 ) t3 USING(uid) ORDER BY exam_cnt,question_cnt DESC