问题分析
请找到昵称以『牛客』开头『号』结尾、成就值在1200~2500之间,且最近一次活跃(答题或作答试卷)在2021年9月的用户信息。
- 找到以『牛客』开头『号』结尾的昵称——like '牛客%号'
- 成就值在1200~2500之间——between 1200 and 2500
- 最近一次活跃(答题或作答试卷)在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);