Триггер Mysql, который умножает два значения из разных таблиц, суммирует по группам и добавляет значения в другой столбец - PullRequest
0 голосов
/ 11 сентября 2018

Я обхожу это вокруг какое-то время, и я никак не могу понять это. Допустим, у меня есть эти три таблицы:

Users

Name   | Basket value
-------+---------------      
John   |     ???
-------+--------------- 
Pierre |     ???



Items

User       |     Item   |     Amount
-----------+------------+------------
  John     |    Pears   |       2
-----------+------------+------------
  Pierre   |    Pears   |       1
-----------+------------+------------
  Pierre   |   Apples   |       3


Market_ prices

Item        |        Price
------------+---------------
Pears       |        2.35
------------+---------------
Apples      |      2.56

Требуется значение корзины. Поэтому для каждой строки в ITEMS она должна умножить свои AMOUNT на MARKET_PRICES[PRICE] и суммировать все результаты, сгруппированные по USER, и поместить этот результат в USERS[total items value]. Но как разработать синтаксис, чтобы применить это на практике?

Заранее большое спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Один из подходов состоит в объединении соответствующих таблиц:

SELECT u.name, SUM(i.amount*m.price)
FROM users u 
JOIN items i ON u.name = i.user
JOIN market_prices m ON i.item = m.item
GROUP BY u.name;

(SQLfiddle этого находится по адресу: http://sqlfiddle.com/#!9/ec224/6 - я добавил несколько других строк в таблицы, чтобы проверить сложность, поэтому итоговые значения - это не то, что вы получите из своего примера. В частности, я добавил Bananas 3.75 в таблицу Market_prices и John Apples 3 и Pierre Bananas 5 в таблицу Items.)

Цель здесь - связать информацию во всех трех таблицах через общие поля (через JOIN), а также группировать и создавать СУММУ рассчитанных затрат как произведение рыночной цены и количества товаров.

---- отредактировано на основе комментариев ---- Чтобы сделать это как обновление, вы можете попробовать:

UPDATE users 
SET basket_value = (SELECT basket FROM
   (SELECT name, SUM(i.amount*m.price) AS basket
   FROM users u JOIN items i ON u.name = i.username 
   JOIN market_prices m ON i.item = m.item
   GROUP BY u.name) q1 WHERE q1.name = users.name);

У меня есть ощущение, что есть более элегантное решение, но это работает. Модифицированный SQLFiddle: http://sqlfiddle.com/#!9/56245a/1

0 голосов
/ 11 сентября 2018
SELECT User, SUM(rev) AS basket_price
FROM
(
SELECT a.User AS User, a.Amount*b.Price AS rev 
FROM Items a
LEFT JOIN
Market_Prices b 
ON a.Item = b.Item
) a1
GROUP BY User
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...