MqSQL. Записать в ячейку одной таблицы сумму значений нескольких ячеек из другой таблицы

Есть 2 таблицы MySQL:

  1. id, object, totalValue
  2. id, item, objectId, value

В первой таблице хранится список имеющихся объектов (object) и общий вес каждого объекта (totalValue). Записей будет от 20 до 100.

Во второй таблице хранится список предметов внутри (item), каждый предмет связан с объектом через objectId, у каждого предмета свой вес (value). Записей будет несколько тысяч.

totalValue у объекта с идентификатором id - это сумма всех value у item из второй таблицы с соответствующим objectId.

Необходимо при изменении value предмета во второй таблице обновлять totalValue у соответствующего объекта в первой.

Например:

Таблица 1
id | object | totalValue
1  | obj1   | 4
2  | obj2   | 6

Таблица 2
id | item | objectId | value
1  | itm1 | 1        | 2   
2  | itm2 | 1        | 1
3  | itm3 | 2        | 3   
4  | itm4 | 1        | 1
5  | itm5 | 2        | 1
6  | itm6 | 2        | 2

На данный момент всё что я придумал - это, после сохранения данных во вторую таблицу, выгружать вторую таблицу в массив, перебирать его в php и результат записывать в первую таблицу.

Подскажите, пожалуйста, можно ли это сделать корректнее?


Ответы (1 шт):

Автор решения: teran

в items добавляете индекс по полю object_id, далее чтобы получить objects с суммарным весом будет две стратегии.

a) подзапрос с суммой

SELECT  o.id, o.object, 
       (SELECT sum(value) FROM i WHERE i.object_id = o.id) as totalValue
FROM o
# WHERE o.id = ... // фильтрация если нужна

б) джойн и группировка

SELECT o.id, o.object, sum(i.value) as totalValue
FROM o
INNER JOIN i ON (i.object_id = o.id)
GROUP BY o.id, o.object
# WHERE o.id = ... 

Если вы выбираете данные для одной записи, то, наверное, первый вариант будет предпочтителен. Если для всех, то второй. Хотя можно и сравнить результаты по скорости, для такого объема таблиц, разницы особой не будет.

→ Ссылка