Как сложить сумму транзакций из таблицы, которая находится на 2 градуса отношений - PullRequest
0 голосов
/ 11 мая 2018

Это урезанная версия структуры моей базы данных

affiliates
    -id

users
    -id
    -affiliate_id

user_transactions
    -id
    -user_id
    -amount - integer
    -type - string(deposit, withdraw)
    -deposit_time - timestamp

Какой самый эффективный способ получить affiliates с суммированными транзакциями по типу (deposit или withdraw и другим), который произошел вчера?

Так что, по сути, мне нужен SQL для возврата

affiliates.id, deposit_amount, withdraw_amount

То, что я делаю сейчас, - это ORM, который в основном выполняет 2 запроса, 1 для филиалов и затем что-то вроде этого:

select id
(select sum(amount) from user_transactions as ut where ut.deposit_time = DATE(?) and ut.user_id = users.id and ut.type = deposit) as deposit_amount, 
(select sum(amount) from user_transactions as ut where ut.deposit_time = DATE(?) and ut.user_id = users.id and ut.type = withdraw) as withdraw_amount
from users where affiliate_id in ?

Это приблизительный запрос. Первые 2 ? являются вчерашней датой, третье - массив идентификаторов пользователей из предыдущего запроса.

Какой самый эффективный способ добиться этого в MySQL?

1 Ответ

0 голосов
/ 11 мая 2018

Вам не нужен стол affiliates.Достаточно простого JOIN, GROUP BY и некоторой условной агрегации:

select u.affiliate_id,
       sum(case when type = 'deposit' then ut.amount else 0 end) as deposit,
       sum(case when type = 'withdraw' then ut.amount else 0 end) as withdraw
from users u join
     user_transactions ut
     on ut.user_id = u.id
group by u.affiliate_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...