Как выбрать сумму значений из одной таблицы, сгруппировав значения из другой?

Рейтинг: 0Ответов: 1Опубликовано: 27.03.2023

Имеется 3 таблицы. Характеристика клиентов clientsInfo, которая может редактироваться, таблица клиентов, где хранится их информация clients и таблица прочтений книг у этих клиентов clientsReads.

Если клиент захочет поменять себе имя, то будет запрос не на update, а на insert в таблицу clientsInfo. Это сделано, чтобы отслеживать актуальную информацию для дальнейших действий.

Пример содержимого таблиц представлен в онлайн mysql, только предварительно надо убрать установку sql_mode=only_full_group_by.

Возникает проблема. Для отображения статистики, при выполнении следующего запроса, вначале выбираются все редакции клиента, вместе с его прочтением, а потом суммируется. В итоге ни имя не верно, ни кол-во прочтений. Запрос:

SELECT clients.id, name, sum(amount) as readed, balance
FROM clients
inner join clientsInfo on clientsInfo.clientId=clients.id
left join clientsReads on clientsReads.clientId=clients.id
GROUP BY clients.id;

Вывод:

Clark  8  123.2
Ava    10 321

*Без группировки:

Clark       4  123.2
ClarkRename 4  123.2
Ava         10 321

Исправив запрос, на предварительную группировку clientsInfo, мне удалось исправить проблему с суммой прочтений, но не с актуальной версией. order by id desc - не работает во вложенном запросе при группировке, можно ли как-то обойтись без 3-й вложенности запроса и как-то иначе получить желаемый результат? Как правильнее будет сгруппировать таблицу версий?

SELECT clients.id, lastVersion.name, sum(amount) as readed, balance
FROM clients
INNER JOIN
        ( SELECT clientId, name
          FROM clientsInfo
          GROUP BY clientId
        ) AS lastVersion
        ON lastVersion.clientId=clients.id
left join clientsReads on clientsReads.clientId=clients.id
GROUP BY clients.id;

Вывод:

Clark  4  123.2
Ava    10 321

Ожидаемый результат:

ClarkRename 4  123.2
Ava         10 321

Ответы

▲ 1

Добавьте в таблицу clientsInfo флаг актуальности. При добавлении новой информации отмечайте старую запись как неактуальную. Тогда можно будет легко выбирать из этой таблицы только актуальные записи.