2017-04-04 53 views
0

我有3個表:右使SUM連接查詢顯示兩條記錄有結果或不

  • 產品:存儲產品,每

enter image description here

    總數量
  • 訂單:存儲訂單及其狀態

enter image description here

  • ORDER_ITEMS:存儲產品和數量各訂單中銷售

enter image description here

我需要找到一種方法來列出這些產品與他們的總量和待處理數量(客戶支付但尚未發貨的產品,換言之,產品數量按狀態paid = 1shipped = 0cancelled = 0)。我想出這個SQL命令:

SELECT 
    products.sku, 
    SUM(order_items.quantity) AS quantity_pending, 
    quantity_total 
FROM 
    order_items 
RIGHT JOIN 
    products ON products.sku = order_items.sku 
RIGHT JOIN 
    orders ON orders.id = order_items.order_id 
      AND paid = 1 AND shipped = 0 AND cancelled = 0 
WHERE 
    products.sku = 'test' 
    OR products.sku = 'test-a' 
    OR products.sku = 'test-b' 
GROUP BY 
    products.sku 

期待與是這樣的結果:

enter image description here

但實際上我得到這個:

enter image description here

這意味着MySQL的只有在pending_quantity> 0時才顯示結果。有沒有辦法達到我的預期?我不介意多個查詢。

回答

1

您的查詢有很多問題。最大的問題,以及結果集中缺少一些skus的原因是,你最終加入orders表。由於該表只有來自sku test的訂單,所以在加入期間其他skus將被丟棄。

另一個問題是,您正在從products表中選擇quantity_total,但該列不是聚合,即使您正在分組。我在下面做的解決方法是使用子查詢計算待處理數量,然後將其加入到products表中。

SELECT p.sku, 
     COALESCE(t.quantity_pending, 0) AS quantity_pending, 
     p.quantity_total 
FROM products p 
LEFT JOIN 
(
    SELECT oi.sku, SUM(oi.quantity) AS quantity_pending 
    FROM order_items oi 
    LEFT JOIN orders o 
     ON oi.order_id = o.id 
    WHERE o.paid = 1 AND o.shipped = 0 AND o.cancelled = 0 
    GROUP BY oi.sku 
) t 
    ON p.sku = t.sku 
WHERE p.sku IN ('test', 'test-a', 'test-b'); 

輸出:

enter image description here

演示在這裏:

Rextester

+0

感謝您對優化我的查詢,但將總結一切,包括已完成的訂單(支付,運送),而不是隻有筆定單(支付,未發貨)。我期望的將會是test = 2,test-a = 0,test-b = 0 – mee

+0

@mee即使添加了你想要的邏輯之後,結果集也不會改變,因爲只有命令#'1'有一個產品sku ,sku是'test'。 –

+0

我的預期是'test = 2,test-a = 0,test-b = 0'。我用原始查詢的問題是,雖然它顯示正確的pending_qty,但不顯示具有零pending_qty的產品。 – mee