Как получить неповторяющиеся строки при запросе с подзапросом и с фильтром "IN"
Нужно получить информацию из всех трех таблиц сразу по нескольким uID и при этом добавить поле с суммой всех операций (oSum), где тип операции (oOper) равен CASHIN.
Пробую использовать такой запрос:
SELECT uID, aName, (SELECT SUM(oSum) from Opers WHERE ouID IN ('1','2','3','4','5') AND oOper = "CASHIN") as TotalCashin FROM Users LEFT JOIN AddInfo on uID = auID LEFT JOIN Opers on uID = ouID WHERE uID IN ('1','2','3','4','5')
Но он возвращает очень много повторяющихся строк, не понимаю почему и как это исправить.
Мне нужно получить такой результат:
uID | aName | TotalCashin
1 | user1 | 100
2 | user2 | 0
3 | user3 | 50
4 | user4 | 1000
5 | user5 | 0
Спасибо.
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
Запишем ваш запрос в более понятном виде, отформатировав его:
SELECT uID,
aName,
(SELECT SUM(oSum)
from Opers
WHERE ouID IN ('1','2','3','4','5') AND oOper = "CASHIN"
) as TotalCashin
FROM Users
LEFT JOIN AddInfo on uID = auID
LEFT JOIN Opers on uID = ouID
WHERE uID IN ('1','2','3','4','5')
Отсюда сразу видно, что:
- запрос на вычисление
SUMу вас никак не привязан к остальным запросам, поэтому он будет одинаковый для всех строк выборки, что явно неправильно - второй
JOINя так понимаю присоединяет к каждому пользователю множество операций, их нужно аггрегировать (через тот жеSUM, например), иначе да, на каждую операцию изOpersбудет своя отдельная строка и пользователи будут повторяться, если есть несколько операций на одного пользователя
Если я что-то в чём-то понимаю, то запрос видимо должен быть такой:
SELECT uID,
aName,
SUM(oSum) as TotalCashin
FROM Users
LEFT JOIN AddInfo on uID = auID
LEFT JOIN Opers on uID = ouID
WHERE uID IN ('1','2','3','4','5')
GROUP BY uID, aName
Может быть нужна ещё будет группировка по auID, но тут я не уверен.
