题解 | #分别满足两个活动的人#
分别满足两个活动的人
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;
不足之处,欢迎指正