问题分析

请找到昵称以『牛客』开头『号』结尾、成就值在1200~2500之间,且最近一次活跃(答题或作答试卷)在2021年9月的用户信息。
  1. 找到以『牛客』开头『号』结尾的昵称——like '牛客%号'
  2. 成就值在1200~2500之间——between 1200 and 2500
  3. 最近一次活跃(答题或作答试卷)在2021年9月的用户——union all/date_format()/if()/max()over()

知识点

  • % :通配符,可以代表任意零个或多个字符。ps:这里的昵称中间只有一个字符,其实也可以使用占位符"_"(下划线),代表任意一个字符;
  • like :模糊查询,用于搜索匹配字段中的指定内容,通常搭配通配符或占位符使用;
  • between num1 and num2 :介于数值num1和num2之间的数值,在mysql中取的是闭区间,即包含边界;
  • union all :表拼接,要求两表的列数相同,各列的数据类型也需要一致,字段名称可以不同;
  • date_format(date,'%Y%m') :将日期转化为年月格式,注意Y是大写的,Y代表的是完整年份,如2022年显示2022,y代表的是简略年份,如2022年显示22;
  • max()over() :最大值窗口函数,用这个函数可以求出每个用户最近一次活跃的时间;
  • if() : 判断函数,用来判断用户最近活跃的月份是否为2021年9月,具体用法:if(<表达式>,表达式结果为true时要显示的值,表达式结果为false时要显示的值) 。

答案参考

SELECT
    uid,nick_name,achievement
FROM
    user_info
WHERE
    nick_name like '牛客%号' 
    and (achievement between 1200 and 2500)
    and uid in
    (SELECT distinct uid
    FROM (SELECT uid
         ,if(max(date_format(start_time,'%Y%m'))over(partition by uid)
             =date_format('2021-09-01','%Y%m')
            ,date_format(start_time,'%Y%m'),null)start_month 
         FROM exam_record
         UNION ALL
         SELECT uid
         ,if(max(date_format(submit_time,'%Y%m'))over(partition by uid)
             =date_format('2021-09-01','%Y%m')
            ,date_format(submit_time,'%Y%m'),null)start_month
         FROM practice_record)a
    WHERE
        start_month is not null);

结果截图