sql查询在状态更改时更新产品数量和订单数量

时间:2013-10-30 13:49:16

标签: php mysql sql

我需要一个更新查询来循环遍历所有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功能吗?

1 个答案:

答案 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没有变化的产品中减去从库存数量中订购的数量。 OLDNEWorders表的别名,与触发器关联的表。这就是为什么我没有使用a作为orders的别名,就像你在SELECT声明中所做的那样。此外,MySQL在多表ORDER BY命令中不允许UPDATE。请检查以随机顺序更新产品是否会导致您的应用出现问题。

请注意,我将SELECT语句的连接条件合并为UPDATE语句的WHERE子句的一部分。您使用的是LEFT JOIN,但我认为您打算使用INNER JOINLEFT 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