Есть таблицы. Далее будут эволюционировать по мере написания поста.
Требуется посчитать сумму заказа. Самый простой способ, сделать это через MySQL
1 2 3 4 |
SELECT SUM(orders_has_goods.goods_quantity * goods.price) FROM orders_has_goods INNER JOIN goods ON orders_has_goods.goods_id = goods.id WHERE orders_id = 6 |
Вариант посложнее, через Delphi.
Запросы
qSelectGoodsOfOrder
1 |
SELECT goods_id FROM unishopmilk_db.orders_has_goods where orders_id=:orders_id; |
qSelectPriceMultiQuantityOfGood
1 2 3 4 |
select (SELECT priceInOrder FROM unishopmilk_db.orders_has_goods where goods_id=:goods_id)* (SELECT goods_quantity FROM unishopmilk_db.orders_has_goods where goods_id=:goods_id)as multi; |
Функция для рассчета суммы заказа
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
function TUniShopOrdersForm.GetPriceOfOrder(AidOrder: integer): Real; var GoodsOfOrderIDArray: Tarray<integer>; i: Integer; begin SetLength(GoodsOfOrderIDArray,0); //getting array of goods id of order with qSelectGoodsOfOrder do begin Connection := UniMainModule.DBConnection.FDConnection; Params.ParamValues['orders_id']:=AidOrder; Disconnect(); Open(); while not EOF do begin SetLength(GoodsOfOrderIDArray,Length(GoodsOfOrderIDArray)+1); GoodsOfOrderIDArray[Length(GoodsOfOrderIDArray)-1] := FieldByName('goods_id').AsInteger; Next(); end; Close(); end; // counting summ of order for i := 0 to High(GoodsOfOrderIDArray) do begin with qSelectPriceMultiQuantityOfGood do begin Connection:=UniMainModule.DBConnection.FDConnection; Params.ParamValues['goods_id']:=GoodsOfOrderIDArray[i]; Params.ParamValues['goods_id']:=GoodsOfOrderIDArray[i]; Disconnect(); Open(); while not EOF do begin Result:=Result+FieldByName('multi').AsFloat; Next(); end; Close(); end; end; |
Эволюция таблиц
Цена на товар может меняться, но сумма заказа должна оставаться, поэтому введено поле priceInOrder в коммутационное таблице, а также orderSumm, для подсчета суммы заказа при вставке в коммутационную таблицу.
Подсчет суммы заказа на процедурном языке MySQL
1 2 3 4 |
SELECT SUM(orders_has_goods.goods_quantity * orders_has_goods.priceInOrder) FROM orders_has_goods #INNER JOIN goods ON orders_has_goods.goods_id = goods.id WHERE orders_id = 12 |
Триггер на подсчет суммы заказа – автоматическая вставка в поле
1 2 3 4 5 6 |
CREATE DEFINER = CURRENT_USER TRIGGER `unishopMilk_db`.`orders_has_goods_BEFORE_INSERT` BEFORE INSERT ON `orders_has_goods` FOR EACH ROW BEGIN SET NEW.orderSumm = NEW.priceInOrder*NEW.goods_quantity; END |