我有两张桌子:
我构建了这个mysql查询:
SELECT SUM(table1.product_quantity) - SUM(order_quantity) AS instocks
FROM table1 -- table.1 in original
LEFT JOIN table2 ON table2.product_hashid = table1.product_id
WHERE table1.product_id = '$thisid'
此查询使用table1复制table2行。此查询中是否有错误?
首先,我要对product_quantity
table1
中的所有product_id = '$this'
求和,并order_quantity
table2
中的所有product_hashid = '$this'
求和{和} { a - b)显示最终结果。
答案 0 :(得分:2)
你想要做的事情很好,但不是你实施的。
- 我想对
product_quantity
table1
的所有product_id = '$this'
求和order_quantity
并table2
product_hashid = '$this'
所有SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID = '$this'; SELECT SUM(order_quantity) FROM Table2 WHERE Product_HashID = '$this'; SELECT (SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID = '$this') - (SELECT SUM(order_quantity) FROM Table2 WHERE Product_HashID = '$this') FROM Dual;
和SELECT Product_ID, SUM(product_quantity) AS Product_Quantity FROM Table1 GROUP BY Product_ID; SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity FROM Table2 GROUP BY Product_HashID; SELECT p.Product_ID, p.Product_Quantity - o.Order_Quantity AS SurplusOnHand FROM (SELECT Product_ID, SUM(product_quantity) AS Product_Quantity FROM Table1 GROUP BY Product_ID) AS P JOIN (SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity FROM Table2 GROUP BY Product_HashID) AS O ON O.Product_ID = P.Product_ID;
b)显示最终结果。
一次建立一步。
SELECT (SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID = '$this') -
NVL(SELECT SUM(order_quantity) FROM Table2 WHERE Product_HashID = '$this'), 0)
FROM Dual;
SELECT p.Product_ID, p.Product_Quantity - NVL(o.Order_Quantity, 0) AS SurplusOnHand
FROM (SELECT Product_ID, SUM(product_quantity) AS Product_Quantity
FROM Table1
GROUP BY Product_ID) AS P
LEFT OUTER JOIN
(SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity
FROM Table2
GROUP BY Product_HashID) AS O
ON O.Product_ID = P.Product_ID;
您可能会发现代码对齐强调了产品ID列的不一致列命名。
在更一般的情况下:
{{1}}
有时您需要使用LEFT OUTER JOIN;大多数情况下,你没有。写这个SQL,假设你没有,直到你确定你这样做。
鉴于数据基数(行数),您可能需要在此处执行LOJ。您需要为Table1中列出的那些未列在表2中的产品的订单数量制造零。
{{1}}
答案 1 :(得分:1)
LEFT JOIN将在每种情况下返回所有table1。 http://www.w3schools.com/sql/sql_join_left.asp
如果它们出现在表2中,您真的只想要table1中的产品吗?如果是这样,你只需要JOIN(或INNER JOIN) http://www.w3schools.com/sql/sql_join_inner.asp
答案 2 :(得分:0)
我认为问题是你的JOIN和你的WHERE子句。在此设置中,您将返回table2中的所有数据,这将给您带来麻烦。你的WHERE子句正在查看table1并限制那里的行,但你的JOIN返回table2中的所有行,只返回table1中相等的那些行。
底线:将您的联接更改为INNER JOIN,您的问题将会消失。