我正在制作一个Web应用程序,以便客户订购用于antyhing的商品。为此,我创建了一个MySQL数据库,其中包含以下表格:
customers
orders
orders-items
products
在customers
表格中有关于此人的所有信息,例如:
示例:
在orders
表中有关于它的所有具体信息,例如:
id
表(customer_id)中的customers
字段相关联示例:
在orders-items
表中,每个客户订购的所有商品都是由上一张表中的order-id
链接的。
id
表(order_id)orders
字段相关联
products
表中的id字段相关联。 (产品)示例:
在products
表格中有关于产品的所有信息:
product_id
表(id)order_items
字段相关联
示例:
问题:
我收到了这个问题:
SELECT `orders-items`.`order_id` , SUM(`orders-items`.`quantity`* `products`.`price`) total
FROM `orders-items`
INNER JOIN `Products` ON `orders-items`.`products_id` = `products`.`id`
它向我显示了order_id
必须支付的所有总价格的列表。
但是我如何做到这一点,以便total_price
每个order_id
必须支付的价值自动插入到orders
字段内的total_price
表中将产品插入我的order_id
表时,是orders-list
吗?
或者是否更好地跟踪total_prices
customers
必须支付的费用?
答案 0 :(得分:4)
要考虑几件事。
拥有total_price
本身就是多余的。您可以随时通过汇总此订单商品的价格来了解此总数。出于性能原因,它可能很有趣,但这对您的场景来说真的有必要吗?它很少。
另一方面,在每个price
上设置order_item
会很有用。原因是因为未来产品价格可能会发生变化,您不希望丢失有关特定销售时销售量的信息。
在任何情况下,您都可以使用这样的触发器更新total_price
:
DELIMITER $$
CREATE TRIGGER order_items_insert AFTER INSERT ON `orders-items` FOR EACH ROW
BEGIN
UPDATE orders o INNER JOIN (SELECT i.order_id id, SUM(i.quantity * p.price) total_price FROM `orders-items` i INNER JOIN products p ON p.id = i.products_id AND i.order_id = new.order_id) t ON t.id = o.id SET o.total_price = t.total_price;
END$$
CREATE TRIGGER order_items_update AFTER UPDATE ON `orders-items` FOR EACH ROW
BEGIN
UPDATE orders o INNER JOIN (SELECT i.order_id id, SUM(i.quantity * p.price) total_price FROM `orders-items` i INNER JOIN products p ON p.id = i.products_id AND i.order_id = new.order_id) t ON t.id = o.id SET o.total_price = t.total_price;
END$$
CREATE TRIGGER order_items_delete AFTER DELETE ON `orders-items` FOR EACH ROW
BEGIN
UPDATE orders o INNER JOIN (SELECT i.order_id id, SUM(i.quantity * p.price) total_price FROM `orders-items` i INNER JOIN products p ON p.id = i.products_id AND i.order_id = old.order_id) t ON t.id = o.id SET o.total_price = t.total_price;
END$$
DELIMITER ;
答案 1 :(得分:1)
一个选项是trigger
,在插入新客户时执行。
备选你可以选择stored procedure
。有了这个,您只需要调用过程InsertCustomer
,数据库就会为您处理价格更新 - >您的应用程序中不会有这些依赖项。
另一种方法是,在transaction
中进行2次查询(插入和更新)。但为此,我建议Domain Driven Design
。您将拥有一个具有方法CreateCustomer(Customer $customer)
的服务,该服务执行插入查询,然后执行更新查询。成功时,它提交事务并返回true,如果不成功,则取消事务并重新设置false。只有在服务(知道业务逻辑)的帮助下操作数据应该是你自己的惯例。