【面试题】
有一张“课程销售订单表”,包含4个字段:用户id、下单日期、下单id、学科。
问题:查询每个用户第一个订单的记录,如果同时下单了包含多个课程的订单,则按照“语文、数学、英语”顺序排序。
【解题步骤】
1. 汇总分析
查询“每个用户第一个订单”,涉及到“每个”,要想到《猴子 从零学会SQL》里讲过的要用“分组汇总”解决该类问题。按用户id分组(group by),第一个订单的记录是指“下单日期”这一列最小的值(汇总用min函数)
select 用户id,
min(下单日期) as 第一次下单日期
from 课程销售订单表
group by 用户id;
2. 多表联结
上面只获取到第一次下单用户的用户id、第一次下单日期。而题目要求如果同时下单了包含多个课程的订单,则按照“语文、数学、英语”顺序排序。
这就要获取到表里的其它数据。可以把上面查询结果作为表a1,和“课程销售订单表”(记为表a2)进行多表联结。
使用多表联结,查询每个用户第一个订单的记录:
select a2.*
from
(select 用户id,
min(下单日期) as 第一次下单日期
from 课程销售订单表
group by 用户id
) as a1
left join
课程销售订单表 as a2
on a1.用户id = a2.用户id and a1.第一次下单日期 = a2.下单日期;
3. 自定义排序
按照“语文、数学、英语”顺序排序,涉及到自定义排序:order by field()的使用。
select a2.*
from
(select 用户id,
min(下单日期) as 第一次下单日期
from 课程销售订单表
group by 用户id
) as a1
left join
课程销售订单表 as a2
on a1.用户id = a2.用户id and a1.第一次下单日期 = a2.下单日期
order by 用户id,field(学科, '语文', '数学', '英语');
【本题考点】
1.涉及到“每个”的问题,要想到《猴子从零学会SQL》里讲过的用“分组汇总”或者“窗口函数”来解决
2.考查对多表联结的应用
3.考查对order by中自定义排序的使用