我是 mySQL 的新手。 我想根据零售价的值(value)和订购产品的数量更新表格的订购价格。我有下表(针对这个问题进行了简化):
产品
:
ProductID
Retail_price
销售订单
:
SalesOrdersID
Order_price //This is the derived attribute that I want to update when the below Sales_products table is updated.
Sales_products
:
SalesOrdersID
ProductID
Quantity
以下代码的工作原理是我得到了正确的 Order_price
并在它自己的表中输出。但我想更新属性 Sales_orders.Order_price
,而不是在表格中调出订单价格。
SELECT
sales_product.SalesOrdersID,
SUM(Quantity * Retail_price) as "Total price of order"
FROM
sales_product
LEFT JOIN products ON sales_product.ProductID = products.ProductID
GROUP BY sales_product.SalesOrdersID
我也试过触发器,但是当我尝试在 Sales_orders
中插入新行时,这会返回错误。
CREATE trigger find_order_price2
AFTER INSERT ON Sales_products
FOR EACH ROW
BEGIN
DECLARE price int;
SELECT
sales_product.SalesOrdersID, SUM(Quantity * Retail_price) INTO price
FROM
sales_product
LEFT JOIN
products ON sales_product.ProductID = products.ProductID;
UPDATE sales_orders
set Order_price = price;
END;
$$
DELIMITER ;
返回错误:
Error Code: 1222. The used SELECT statements have a different number of columns
希望有人能帮忙吗?
最佳答案
这是一个触发器,所以我希望它使用 new
或 old
。
这通常会逐步完成:
CREATE trigger trig_sales_products_update_price
AFTER INSERT ON Sales_products
FOR EACH ROW
BEGIN
UPDATE sales_order so JOIN
product p
ON p.product_id = new.product_id
SET so.order_price = so.order_price + new.quantity * p.retail_price
WHERE so.SalesOrderId = new.SalesOrderId
END;
$$
DELIMITER ;
如果愿意,您可以重新计算整个值:
CREATE trigger trig_sales_products_update_price
AFTER INSERT ON Sales_products
FOR EACH ROW
BEGIN
UPDATE sales_order so JOIN
(SELECT sp.SalesOrderId,
SUM(sp.quantity * p.retail_price) as new_total
FROM sales_products sp
product p
ON p.product_id = sp.product_id
WHERE sp.SalesOrderId = new.SalesOrderId
GROUP BY sp.SalesOrderId
) sp
ON so.SalesOrderId = sp.SalesOrderId
SET so.order_price = sp.new_total
END;
$$
DELIMITER ;
但是,触发器通常是增量完成的。
请记住,如果您这样做,您还需要 update
和 delete
触发器。这就是为什么“即时”计算这些值比使用触发器维护它们更简单的原因。
关于mysql - 如何根据聚合函数的结果更新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559395/