Mysql左/内连接组合未按预期工作

sco*_*ott 11 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'
Run Code Online (Sandbox Code Playgroud)

但是这也得到了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'
Run Code Online (Sandbox Code Playgroud)

但是那些尚未订购的产品没有被列出.我希望它们显示为SUM(数量)为NULL.任何人都可以看到我的逻辑出错了吗?谢谢!斯科特

小智 24

虽然Kaj的答案是正确的,但它并不一定是理想的,因为MySQL在使用派生表(子选择)时往往会跳过索引的使用.至少,这是我的理解.如果将连接放在括号内,则可以继续使用JOINS的方法:

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;
Run Code Online (Sandbox Code Playgroud)

请记住LEFT JOIN的ON子句需要在括号之后.我希望这有帮助!


kaj*_*kaj 6

如果唯一计数的产品订单是当前的那些,那么您需要先找到该子集,然后再进行左联接。否则,如果您进行左连接,您将获得全部或仅订购已发现的那些。

因此,类似以下内容的方法应该起作用:

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
Run Code Online (Sandbox Code Playgroud)