我正在尝试列出订购数量的产品变化,但也显示没有订购数量的产品变化。所以我认为这就像选择产品并在订单是当前版本的每个产品的订单上进行左连接一样简单。
所以我期望这样的操作顺序:
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。 任何人都可以看到我的逻辑出错了吗? 谢谢! 斯科特
答案 0 :(得分:21)
虽然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;
请记住LEFT JOIN的ON子句需要在括号之后。我希望这有帮助!
答案 1 :(得分:5)
如果唯一的产品订单是最新的,那么您需要在之前找到之前的子集。否则,如果您进行左连接,您可以获得全部或仅获得您发现的那些订单。
所以类似下面的内容应该有效:
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
答案 2 :(得分: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