题解 | #筛选限定昵称成就值活跃日期的用户#
筛选限定昵称成就值活跃日期的用户
https://www.nowcoder.com/practice/2ed07ff8f67a474d90523b88402e401b
好久没回来写啦,期间真的很感谢大家喜欢我写的那个题解。
这道题其实思路比较简单,我们根据需求拆开两步来吧~
第一步:昵称以『牛客』开头『号』结尾、成就值在1200~2500之间
那么这个仅仅需要看user_info这张表的nickname和achievement字段即可轻松解决
select uid, nick_name, achievement from user_info where nick_name like '牛客%号' and (achievement between 1200 and 2500)
第二步:寻找最近一次活跃(答题或作答试卷)在2021年9月的用户
注意这里要看清楚题目含义,也就是最后的考试或者练习时间为2021年9月,大于或者小于都不满足该需求
这步需要用到剩余的两张表exam_record和practice_record啦,因为它们都属于活跃的范畴和标识
因此可以先考虑两表合并,这时候就得考虑union all这个关键字啦
PS:1年前做这道题的时候我是每个表分别取每个用户最后一次作答和练习的时间,待合并后再来一次max比较。
但现在做的话,我会想先合并再做Max比较,这样我觉得少用两次Max关键字会好很多吧(doge,并不会,可以想想为什么)
select distinct uid from ( select uid, DATE_FORMAT(start_time, "%Y%m") as st from exam_record union all select uid, DATE_FORMAT(submit_time, "%Y%m") as st from practice_record ) as t group by uid having max(st) = "202109"
那么剩下的就是组装啦(通过UID去连接),最终代码如下:
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, DATE_FORMAT(start_time, "%Y%m") as st from exam_record union all select uid, DATE_FORMAT(submit_time, "%Y%m") as st from practice_record ) as t group by uid having max(st) = "202109" )