题解 | #筛选限定昵称成就值活跃日期的用户#

筛选限定昵称成就值活跃日期的用户

https://www.nowcoder.com/practice/2ed07ff8f67a474d90523b88402e401b

好久没回来写啦,期间真的很感谢大家喜欢我写的那个题解。

这道题其实思路比较简单,我们根据需求拆开两步来吧~

第一步:昵称『牛客』开头『号』结尾成就值1200~2500之间

那么这个仅仅需要看user_info这张表的nicknameachievement字段即可轻松解决

select 
	uid, 
	nick_name, 
	achievement 
from user_info
where nick_name like '牛客%号' and (achievement between 1200 and 2500)

第二步:寻找最近一次活跃(答题或作答试卷)在2021年9月的用户

注意这里要看清楚题目含义,也就是最后的考试或者练习时间为2021年9月,大于或者小于都不满足该需求

这步需要用到剩余的两张表exam_recordpractice_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"
)

全部评论

相关推荐

黑皮白袜臭脚体育生:春节刚过就开卷吗?哈基馆,你这家伙......
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务