Допустим, у меня есть 2 таблицы:

Первый - товары :

+------------------+-----------------+--------+
| Product Name     |      Type       | Price  |
+------------------+-----------------+--------+
| Carrots          | Vegetables      | 10     |
| Oranges          | Fruits          |     20 |
| Beer             | Drinks          |     50 |
| Milk             |  Dairy products |     30 |
| Burgers          |  meat           |     40 |
| Baguettes        | bread           |    10  |

Второй - Комбинации :

+-----------+---------+-----------+-------------+
| Item1     |  Item2  |   Item3   |  TotalPrice |
+-----------+---------+-----------+-------------+
| Carrots   | Oranges | Beer      |             |
| Milk      | Burgers | Baguettes |             |
+-----------+---------+-----------+-------------+

Я хочу обновить общую стоимость каждой комбинации на основе общей стоимости ее продуктов.

Например, в столбце TotalPrice комбинации молока, бургеров и багетов будет 80.

Как я могу этого достичь?

1
itailitai 15 Сен 2018 в 20:14

2 ответа

Лучший ответ

Вы можете использовать подзапрос для вычисления суммы на основе элементов комбо:

UPDATE combos SET total_price = (SELECT SUM(price) FROM products
    WHERE product_name IN (item1, item2, item3));
1
Eugene Yarmash 15 Сен 2018 в 17:23

Ваш подход не совсем правильный, отношение не правильно представлено. Подумайте о двух сущностях Product и Combo и о том, как они связаны. Один Combo определенно может иметь много Product, верно? Но кроме того, Product может принадлежать многим Combo, согласны? Это означает, что между ними существует связь many-to-many. Для моделирования этой связи вам понадобится третья таблица, Combo_Product, которая будет содержать запись, только если Product принадлежит Combo.

С помощью этой модели вы можете просто объединить их с помощью таблицы моста и выполнить агрегирование для получения любой суммы.

Запрос будет в строках:

select c.id_combo, sum(p.price)
from combo c
join combo_product cp on c.id_combo = cp.id_combo
join product p on cp.id_product = p.id_product
group by c.id_combo;
1
NiVeR 15 Сен 2018 в 17:24