暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql多表连接

麦子酱OvO 2021-08-04
357

文章都是前一天晚上抽出固定时间写,第二天定点8:00准时推送,记录每日所学,所想,持续输入输出,不断分享,提升自己。

作为测试,日常难免会与sql打交道,那么多表连接你真的会吗?首先我们看下面的sql,多表连接时order_sale_item表既可以和订单order_sale表做关联也可以和售后子项表order_return_item做关联,我想都没多想,直接和订单表了关联:

SELECT
-- 未入账仅退款数量
IFNULL(sum( osi.price * ori.notInMS2SSQuantity ),0) AS amount
FROM
order_return r
INNER JOIN order_return_item ori ON r.id = ori.orderReturnId
INNER JOIN order_sale os ON os.id = r.orderSaleId
INNER JOIN order_sale_item osi ON osi.orderSaleId = os.id
WHERE
os.mallId = 5
AND os.buyerType != 3
AND r.type = 1
AND r.state = 3
AND ori.notInMS2SSQuantity >0
AND os.supplierId = 15
AND os.state!=-4
执行结果如下:

嗯,结果和开发的结果不一致,那么哪里出了问题的,带着疑问请教了开发,开发帮忙修改之后sql如下:
SELECT
-- 未入账仅退款数量
IFNULL(sum( osi.price * ori.notInMS2SSQuantity ),0) AS amount
FROM
order_return r
INNER JOIN order_return_item ori ON r.id = ori.orderReturnId
INNER JOIN order_sale_item osi ON osi.id = ori.orderSaleItemId
INNER JOIN order_sale os ON os.id = r.orderSaleId
WHERE
os.mallId = 5
AND os.buyerType != 3
AND r.type = 1
AND r.state = 3
AND ori.notInMS2SSQuantity >0
AND os.supplierId = 15
AND os.state!=-4
执行结果如下:

那么为什么得出的结果不一致呢:我们需要订单子项表价格*售后子项表的数量,第一个sql订单表关联订单子项表,订单表又关联售后表,售后表关联售后子项表,而订单子项表和售后子项表无关联,导致sql执行的结果值不正确,示意图如下:

第二个sql售后表关联售后子项表,售后子项表关联订单子项表,订单子项表关联订单表,售后子项表关联订单子项表,订单子项表关联订单表,形成一条不分叉的直线,示意图如下:

总结:多表关联时,上下表层层递进,不要分叉,这样结果才会正确
文章转载自麦子酱OvO,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论