select orderitemID, SUM(orderitem.UnitPrice) sum_price
from orderitem
group by orderitemID
Это группирует по orderitemID
, что, как я предполагаю, является первичным ключом таблицы orderitem
.Поскольку вы группируете по уникальному столбцу, «группы» - это всегда группы по 1, а «сумма» всегда равна каждому отдельному значению цены за единицу.
В результате ваш UPDATE перезаписывает TotalAmmount
несколько раз, и получает последнюю цену за единицу вместо суммы всех цен за единицу заказа.
Вы должны группировать по orderID
, поэтому вы получаете сумму для всех элементов заказа, принадлежащих к одному и тому же заказу.
select orderID, SUM(orderitem.UnitPrice) sum_price
from orderitem
group by orderID
Вторая проблема: вам не нужно обновлять все ордера каждый раз, когда вы вставляете элемент ордера.Вам просто нужно обновить итоговую сумму за один заказ, для элемента заказа, который вы вводите.Поэтому вы должны ограничить подзапрос строками WHERE orderID = NEW.orderID
.
CREATE DEFINER = 'root'@'localhost' TRIGGER `orderTotalInsert`
AFTER INSERT ON `orderitem` FOR EACH ROW
BEGIN
UPDATE `Order`
INNER JOIN (
SELECT orderID, SUM(orderitem.UnitPrice) sum_price
FROM orderitem
WHERE orderID = NEW.orderID
GROUP BY orderID
) t on t.orderID = order.OrderId
SET Order.TotalAmmount = t.sum_price;
END