0

我需要一个更新查询来遍历所有 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 上的数量。

或者也许是一个执行此操作的 php 函数?

4

1 回答 1

0

这是一个名为的 MySQL 触发器updateInStock,它可以满足您的需求。

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;

对于表中状态从 5 变为 6 且在 中没有变化的产品,该UPDATE命令从库存数量中减去订购数量。 并且是表的别名,与触发器关联的表。这就是为什么我没有像您在声明中那样使用的别名。此外,MySQL 不允许使用多表命令。请检查随机更新产品是否会给您的应用程序带来问题。ordersinvoiceStatusOLDNEWordersaordersSELECTORDER BYUPDATE

请注意,我将您的SELECT语句的连接条件合并为UPDATE语句WHERE子句的一部分。您正在使用 a LEFT JOIN,但我认为您打算使用INNER JOIN. 外部联接,例如LEFT JOIN返回所有行,即使在另一个表中没有匹配项。在您的情况下,您只需要订单号和产品代码匹配的行,因此您需要一个INNER JOIN.

有关UPDATEMySQL 5.6 中命令的更多信息,请参阅http://dev.mysql.com/doc/refman/5.6/en/update.html上的文档。触发器文档位于http://dev.mysql.com/doc/refman/5.6/en/create-trigger.html

于 2013-10-30T21:30:39.200 回答