2012-03-15 20 views
9

我試圖列出產品變體及其訂購數量,但也顯示沒有訂購數量的產品變體。所以我認爲這將會像選擇產品一樣簡單,並對訂單是當前版本的每個產品的訂單進行左連接。Mysql左/內部連接組合不能按預期方式工作

所以我預計這樣的操作順序:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
LEFT JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 

但也越來越量在is_current不是1 後來我想,後左沒關係,我可以做一個內部聯接加入反而像這樣:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 

但是然後尚未訂購的產品尚未列出。我期望他們顯示爲SUM(數量)爲NULL。 任何人都可以看到我的邏輯出錯了嗎? 謝謝! 斯科特

回答

4

如果只產品訂單即算有那些是目前則需要你做了左之前找到該子集加入吧。否則,如果你做了一個左連接,你可以獲得所有或者只有你發現的那些命令。

所以像下面應該工作:

select p.productid, sum(po.quantity) 
from products p 
left outer join (select po.productid, po.quantity 
         from productorders po 
         inner join orders o on o.orderid = po.orderid and o.iscurrent = 1) po on po.productid = p.productid 
group by p.productid 
+0

是有道理的,我會嘗試它...一秒 – scott 2012-03-15 09:35:58

+0

完美,偉大的工程! !確切需要什麼。非常感謝! – scott 2012-03-15 09:52:15

+0

沒問題。你在正確的軌道上;只需要一個額外的步驟 – kaj 2012-03-15 10:09:40

0

,嘗試按你的產品ID:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN `product_orders` po ON p.product_id=po.product_id 
INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1' 
GROUP BY p.product_id 
+0

感謝您的回覆,仍然只列出至少有數量爲1的產品(因此出現在product_orders表中) – scott 2012-03-15 09:20:18

+0

如果您將「INNER JOIN」更改回「LEFT JOIN」,它是否正常工作? – Alp 2012-03-15 09:22:52

+0

是的,查詢然後工作,但我也得到所有的數量is_current!='1'然後(所以相同訂單的舊版本) – scott 2012-03-15 09:26:49

18

儘管凱伊的答案是正確的,它不一定是理想的,因爲MySQL的傾向於使用派生表(子選擇)時跳過索引的利用率。至少,這是我的理解。您可以繼續使用使用連接你的方法,如果你把括號內的聯接:

SELECT p.product_id, SUM(po.quantity) 
FROM `products` p 
LEFT JOIN (`product_orders` po 
    INNER JOIN `orders` o ON o.order_id=po.order_id AND o.is_current='1') 
ON p.product_id=po.product_id; 

請記住,對於LEFT ON子句JOIN需求來括號之後。我希望這有幫助!

+0

對不起,我不經常使用stackoverflow,並不知道如何將代碼放入它自己的部分。 – Chosun 2013-08-08 21:49:28

+0

我有時會過分看你在索引和子選擇方面的優點。很好的解釋。 – mkralla11 2014-06-16 14:01:18

+0

謝謝!我盡我所能...哈。 – Chosun 2014-06-23 18:48:39