题解 | #分别满足两个活动的人#

分别满足两个活动的人

http://www.nowcoder.com/practice/a126cea91d7045e399b8ecdcadfb326f

明确题意:

输出2021年里,所有每次试卷得分都能到85分的人以及至少有一次用了一半时间就完成高难度试卷且分数大于80的人的id和活动号,按用户ID排序输出。

问题拆解:

  • 本题主要是考察知识点:group by、date_format、timestampdiff、union等
  • 用not in排除掉考过小于85分的用户,记得用distinct去重,得到每次试卷得分都能到85分的人
  • 按秒计时,计算出时间,得到至少有一次用了一半时间就完成高难度试卷且分数大于80的人
  • 2个子表用union all 拼接起来,没必要用union

注意:

mysql> select TIMESTAMPDIFF(MINUTE, '2018-03-20 09:01:05', '2018-03-20 09:31:15');
+---------------------------------------------------------------------+
| TIMESTAMPDIFF(MINUTE, '2018-03-20 09:01:05', '2018-03-20 09:31:15') |
+---------------------------------------------------------------------+
|                                                                  30 | -- 实际已经超过30分钟!!!!
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPDIFF(second, '2018-03-20 09:01:05', '2018-03-20 09:31:15');
+---------------------------------------------------------------------+
| TIMESTAMPDIFF(second, '2018-03-20 09:01:05', '2018-03-20 09:31:15') |
+---------------------------------------------------------------------+
|                                                                1810 | -- 按秒 才对!!
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select TIMESTAMPDIFF(second, '2021-09-01 12:31:51' ,'2021-09-01 12:01:01' )
    -> 
    -> ;
+----------------------------------------------------------------------+
| TIMESTAMPDIFF(second, '2021-09-01 12:31:51' ,'2021-09-01 12:01:01' ) |
+----------------------------------------------------------------------+
|                                                                -1850 | -- 注意参数顺序,差值 = 后面的 - 前面的  !!!!  +----------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

代码实现:

SELECT DISTINCT uid, 'activity1' AS activity -- 筛选后的uid可能重复,用distinct去重
FROM exam_record
WHERE score >= 85 and year(submit_time) = '2021'
	AND uid NOT IN ( -- 排除掉小于85分的
		SELECT DISTINCT uid
		FROM exam_record
		WHERE score < 85
	)
UNION ALL
SELECT DISTINCT t1.uid, 'activity2' AS activity  -- 筛选后的uid可能重复,用distinct去重
FROM (
	SELECT *
	FROM exam_record
	WHERE score > 80 and year(submit_time) = '2021' -- 筛选出大于80分的
) t1
	JOIN (
		SELECT *
		FROM examination_info
		WHERE difficulty = 'hard'
	) t2
	ON t1.exam_id = t2.exam_id
WHERE TIMESTAMPDIFF(second, t1.start_time, t1.submit_time) <= t2.duration * 30 -- 按秒计时才对,注意后2个参数的顺序!!
ORDER BY uid;


不足之处,欢迎指正

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-28 13:48
hory权:校招vip纯神人了,还说自己是什么师范大学的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务