我正在为大学项目创建一个简单的web_shop数据库,它需要存储用户过去的订单并显示订单的总成本。我一直试图解决这个问题几个小时
使用当前的触发器,当我尝试在我的“事务”表中插入更多行时,我收到错误:
ERROR 1242 (21000): Subquery returns more than 1 row
并且每个收据/订单的“总价格”显示为“17 .9”(对于receipt_id'1',它们应为17.9,对于receipt_id'2',它们应为3.5)。收据是一组交易(例如receipt_id = 5 - > 5个橙子,3个香蕉和1个苹果总价12.50美元)
通过以下(3)触发器计算sub_total(交易)(项目*数量的价格):
CREATE TRIGGER calcsub_insert BEFORE INSERT/BEFORE UPDATE/AFTER UPDATE
FOR EACH ROW
BEGIN
SET NEW.sub_total = NEW.transaction_price * NEW. transaction_quantity;
END
total_price(收据)目前通过以下(3)触发器计算:
CREATE TRIGGER BEFORE INSERT/BEFORE UPDATE/AFTER DELETE ON transactions
FOR EACH ROW
UPDATE receipt
SET total_price = (SELECT SUM(sub_total) FROM transactions GROUP BY receipt_id)
我已经在下面包含了我的架构,希望能让情况更加清晰。我认为'group by'将返回每个receipt_id的所有总计,但它似乎不起作用。感谢您提前获得任何帮助或提示!
答案 0 :(得分:0)
SELECT ... GROUP BY receipt_id
查询将为receipt_id
的每个不同值返回一行。
也许我们只想为receipt_id
的单个值返回一行。触发触发器的transactions
行的值。
SELECT SUM(t.sub_total) FROM transaction t WHERE t.receipt_id = NEW.receipt_id
似乎我们只想更新receipt
中匹配receipt_id
UPDATE receipt r
...
WHERE r.receipt_id = NEW.receipt_id
(表transactions
的名称(在触发器定义中引用)应该与SELECT查询中引用的表transaction
的名称相同吗?现在,它有点令人困惑,因为看起来它们引用了两个不同的表。)
触发器的时机似乎有点奇怪......在新行添加到transactions
之前从transactions
右计算总数,而不是总计{在应用更改后更新。我们也希望在引用它之前确保sub_total
的值已分配。 (现在MySQL 5.7允许在表上有多个BEFORE INSERT触发器,如果我们要有多个触发器,我们需要注意触发器触发的顺序是否有依赖。
(然后,我对用例没有了解。)
另外需要考虑的边缘情况......修改transactions
的{{1}}的更新...似乎可能会有两个可能受影响的receipt_id值。请考虑此更新:
receipt_id
好像我们想要更新UPDATE `transactions` t
SET t.receipt_id = 3333
WHERE t.receipt_id = 2222
AND t.transaction_id = 111
表中的两行...一行receipt
,另一行r.receipt_id = OLD.receipt_id
。
当r.receipt_id = NEW.receipt_id
时,我们只会有一行要更新。我们只需要在OLD.receipt_id = NEW.receipt_id
时更新两行。