题解 | #分别满足两个活动的人#
分别满足两个活动的人
https://www.nowcoder.com/practice/a126cea91d7045e399b8ecdcadfb326f
select distinct uid, 'activity1' AS activity FROM exam_record WHERE YEAR(start_time) = '2021' GROUP BY uid HAVING MIN(score) >= 85 # 至少有一次用了一半时间就完成高难度试卷且分数大于80的 union select distinct uid, 'activity2' AS activity FROM exam_record AS er JOIN examination_info AS ei using(exam_id) WHERE score > 80 AND difficulty = 'hard' AND TIMESTAMPDIFF(SECOND, start_time, submit_time) * 2 <= duration * 60 AND YEAR(start_time) = '2021' ORDER BY uid
- 每次试卷得分都能到85分的人(activity1),要根据uid分组,如果每个uid的最小分数都大于85就满足条件
- 至少有一次用了一半时间就完成高难度试卷且分数大于80的,这个是至少有一次,即有就行了,不需要对uid进行分组,但是要对uid进行去重distinct
- 算时间差函数
TIMESTAMPDIFF(SECOND, start_time, submit_time) 第一个参数指定时间差的单位(年月日时分秒) 第二个参数是开始时间,第 三 个参数是结束时间
- 合并两个查询结果用union all
- union all 和
union
的区别UNION ALL
返回所有 SELECT 语句生成的行,包括重复行。它简单地将多个结果集合并在一起,不去除重复行或执行任何类型的排序。UNION
也用于合并多个 SELECT 语句的结果集,但它会自动去除重复的行。这意味着如果两个 SELECT 语句的结果集中存在相同的行,则UNION
只会返回其中的一行,而不会返回重复的行。