下午面试了一家java开发岗,面试官提了一个mysql的面试题,现在来做一下复盘
1.题目:
有订单表:订单id,店铺id,订单金额,订单生成时间,订单支付状态0-未支付,1-已支付;
店铺表: 店铺名称,店铺logo,店铺描述
现在需要查询上个月订单销售额最高的三个店铺信息,请描述你的实现思路
2.我的回答:
select 店铺id,店铺名称,店铺logo,店铺描述 from 店铺表 where 店铺id = (select 店铺id from 订单表 where 订单生成时间 between ... and ... ordered by 订单金额 limit 0, 3)
3.复盘:由于一个店铺可以有多笔订单,且需要查询的是销售额最高的三个店铺(请注意这里是销售额,而不是订单金额),销售额=该店铺下所有订单金额的总和,并且还会出现下面的问题
1个店铺对应多个订单,如果有下面情况:
店铺a:订单1
店铺a:订单2
店铺a:订单3
店铺b:订单4
那么会出现查询出来的前三个店铺都会是店铺a的情况,
修改后的sql:
select 店铺id,店铺名称,店铺logo,店铺描述 from 店铺表 join (select 店铺id, sum(销售额) from 订单表 where 订单生成时间between ... and ... group by 店铺id order by 销售额 limit 0, 3)