【场景】:行合并
【分类】:合并查询、两个时间相减得到分钟
分析思路
难点:
1.单个字符或者值可以作为一列:例如'activity2' as activity
2.用了一半时间就完成高难度试卷。两个时间相减得到分钟:timestampdiff(minute, date_expr1, date_expr2) 两个时间的差
(1)统计每次试卷得分都能到85分的人的id和活动号
-
[条件]:where year(start_time) = 2021 group by uid having min(score) >= 85
-
[使用]:distinct。一定要去重
(2)统计至少有一次用了一半时间就完成高难度试卷且分数大于80的人的id和活动号
-
[条件]:where difficulty = 'hard' and score > 80 and year(start_time) = 2021 and timestampdiff(minute, start_time, submit_time) < duration / 2
-
[使用]:多表连接使用 join using( )
(3)合并两个表,按用户ID排序输出
- [使用]:union all 和union 都可以,因为列activity不会有重复。
最终结果
(
select 查询结果 [用户ID; 活动]
from 从哪张表中查询数据[试卷作答记录表]
where 查询条件 [21年的答题记录]
group by 分组条件 [用户ID] having 判断条件 [最少得分大于等于85]
)
union
(
select 查询结果 [用户ID; 活动]
from 从哪张表中查询数据[试卷表、试卷作答记录表]
where 查询条件 [得分大于80并且是21年的答题记录,时间小于一半]
)
order by 对查询结果排序 [按用户ID排序];
扩展
前往查看:MySQL 合并查询 union
求解代码
方法一
union
(
#统计每次试卷得分都能到85分的人的id和活动号
select
uid,
'activity1' as activity
from exam_record
where year(start_time) = 2021
group by uid having min(score) >= 85
)
union all
(
#统计至少有一次用了一半时间就完成高难度试卷且分数大于80的人的id和活动号
select
uid,
'activity2' as activity
from examination_info
join exam_record using(exam_id)
where difficulty = 'hard'
and score > 80
and year(start_time) = 2021
and timestampdiff(minute, start_time, submit_time) < duration / 2
group by uid
)
order by uid