【场景】:行合并

【分类】:合并查询、两个时间相减得到分钟

分析思路

难点:

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