来自2个不同表的MySQL SELECT,其中2个表具有WHERE子句,并且1个结果为NULL

时间:2019-03-15 05:01:46

标签: mysql join select left-join outer-join

我正在尝试在cart_items表中获得订购数量,并在shipping_table中获得装运数量。问题是,有些skus尚未发货,我可以A)仅拉出已发货的物品,或者B)没有正确的总发货数量。

样品数据

`shipping_table`    
id  |  invoice  | sku   | qty  | order_id
99  |   104     | 15628 |  1   |  9313
98  |   104     | 34929 |  2   |  9313
97  |   103     | 34929 |  1   |  9313
96  |   102     | 15628 |  87  |  9999
95  |   101     | 34929 |  32  |  9999
94  |   100     | 35870 |  6   |  9999


`cart_items`    
id     |  cart_id | sku   | qty
64903  |  4935153 | 15628 |  1  
65108  |  4935153 | 34929 |  4  
65109  |  4935153 | 35870 |  4  

在此结果中,我们应该看到sku 35870没有发货,15628已经发货,sku 34929只发货了3件。

预期结果

sku   | total_qty | total_shipped_qty
15628 |      1    |          1
34929 |      4    |          3
35870 |      4    |          NULL   

错误结果A

这是一个接近的例子,但是由于我查询的是仅在一个表中的order_id,因此它不会为sku 35870拉total_qty,因为它不在shipping_table中还没有(根本没发货)。

SELECT 
    CT.sku, 
    MT.`qty` as total_qty, 
    SUM(CT.`qty`) as total_shipped_qty 
FROM `shipping_table` CT 
        LEFT JOIN 
     `cart_items` MT ON MT.sku = CT.sku 
WHERE MT.`cart_id` = '4935153' AND CT.`order_id` = '9313'
GROUP BY MT.sku

sku   | total_qty | total_shipped_qty
15628 |      1    |          1
34929 |      4    |          3

错误结果B

这很接近,但是它是不正确的total_shipped_qty值,因为它正在查看整个shipping_table中的总计。此结果看起来像是总结了shipping_table的整个数量。

SELECT 
    CT.sku, 
    MT.`qty` as total_qty, 
    SUM(CT.`qty`) as total_shipped_qty 
FROM `shipping_table` CT 
        LEFT JOIN 
     `cart_items` MT ON MT.sku = CT.sku 
WHERE MT.`cart_id` = '4935153'
GROUP BY MT.sku

sku   | total_qty | total_shipped_qty
15628 |      1    |          88
34929 |      4    |          35
35870 |      4    |          6

1 个答案:

答案 0 :(得分:0)

使用标量子查询

DEMO

SELECT 
     CT.sku, 
     qty as total_qty, 
    (select SUM(qty) from shipping_table MT where CT.sku=MT.sku group by MT.sku) 
    as total_shipped_qty 
FROM cart_items CT
      WHERE CT.cart_id = '4935153'