mysql - 如何根据聚合函数的结果更新属性

标签 mysql sql database-trigger

我是 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

希望有人能帮忙吗?

最佳答案

这是一个触发器,所以我希望它使用 newold

这通常会逐步完成:

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 ;

但是,触发器通常是增量完成的。

请记住,如果您这样做,您还需要 updatedelete 触发器。这就是为什么“即时”计算这些值比使用触发器维护它们更简单的原因。

关于mysql - 如何根据聚合函数的结果更新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559395/

相关文章:

postgresql - 如何检查何时创建了 postgres 触发器?

postgresql - 将从多行构建一行的触发器

MYSQL GROUP BY 2 个表

mysql - 如何使用表 B 中的记录计数更新表 A 中的分数列?

php - HY093 错误 PDO 可用房间下拉列表

php - 如何获取所有记录并在右侧显示信息。取决于数据库中的值

python sql查询列表中的时间戳

mysql - 如何在 MySQL 中禁用触发器?

php - Drupal 7 使用 If 条件 mysql 数据库选择查询

MySQL -Pentaho 从模式获取 View 时出错[null]