Как получить неповторяющиеся строки при запросе с подзапросом и с фильтром "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, но тут я не уверен.

→ Ссылка