我需要一个更新查询来循环遍历所有b.quantityOrdered并从d.quantityInStock中减去该数量。 SQL循环准确显示了我需要更新的内容:
select
d.productCode as prod,
b.quantityOrdered as qtyO,
d.quantityInStock as qtyIS
from orders a
left join orderdetails b on a.orderNumber=b.orderNumber
left join products d on b.productCode=d.productCode
where a.status=6 and a.invoiceStatus=4
order by 1 asc
结果是:
prod qtyO qtyIS
104 19 110
104 4 110
104 20 110
105 10 20
105 15 20
105 24 20
更好的是,如果我可以在MySql DB中创建一个函数,那么当a.status从5变为6时,此更新函数将循环orderdetails表并减去quantityinstock上的quantityordered。
或者也许这是一个PHP功能吗?
答案 0 :(得分:0)
这是一个名为updateInStock
的MySQL触发器,可以满足您的需要。
CREATE TRIGGER updateInStock BEFORE UPDATE ON orders
FOR EACH ROW BEGIN
UPDATE orders, orderdetails b, products d
SET d.quantityInStock = d.quantityInStock - b.quantityOrdered
WHERE NEW.orderNumber = b.orderNumber AND b.productCode = d.productCode
AND OLD.status = 5 AND NEW.status = 6 AND
OLD.invoiceStatus = 4 AND NEW.invoiceStatus = 4;
END;
UPDATE
命令从orders
表中状态从5变为6且invoiceStatus
没有变化的产品中减去从库存数量中订购的数量。 OLD
和NEW
是orders
表的别名,与触发器关联的表。这就是为什么我没有使用a
作为orders
的别名,就像你在SELECT
声明中所做的那样。此外,MySQL在多表ORDER BY
命令中不允许UPDATE
。请检查以随机顺序更新产品是否会导致您的应用出现问题。
请注意,我将SELECT
语句的连接条件合并为UPDATE
语句的WHERE
子句的一部分。您使用的是LEFT JOIN
,但我认为您打算使用INNER JOIN
。 LEFT JOIN
之类的外连接会返回所有行,即使其他表中没有匹配项也是如此。在您的情况下,您只需要订单号和产品代码匹配的行,因此您需要INNER JOIN
。
有关MySQL 5.6中UPDATE
命令的更多信息,请参阅http://dev.mysql.com/doc/refman/5.6/en/update.html处的文档。触发器文档位于http://dev.mysql.com/doc/refman/5.6/en/create-trigger.html。