MqSQL. Записать в ячейку одной таблицы сумму значений нескольких ячеек из другой таблицы
Есть 2 таблицы MySQL:
- id, object, totalValue
- 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 шт):
в 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 = ...
Если вы выбираете данные для одной записи, то, наверное, первый вариант будет предпочтителен. Если для всех, то второй. Хотя можно и сравнить результаты по скорости, для такого объема таблиц, разницы особой не будет.