У меня есть таблица транзакций, настроенная следующим образом:

-- Transactions table
+----+---------+-------+------------------+--------+-----------+
| id | from_id | to_id | transaction_type | amount | card_type |
+----+---------+-------+------------------+--------+-----------+
| 1  | 1       | 1     | deposit          | 90     | debit     |
| 2  | 1       | 2     | transfer         | -60    | debit     |
| 3  | 2       | 2     | deposit          | 10     | debit     |
| 4  | 2       | 2     | deposit          | 20     | credit    |
+----+---------+-------+------------------+--------+-----------+

Если я внесу депозит, он должен показать положительное значение, чтобы показать, что деньги были добавлены на мой счет, но если я сделаю перевод, он должен использовать отрицательный баланс, чтобы показать, что деньги были удалены с моего счета. Проблема в том, что я не могу придумать запрос, который добавлял бы деньги к учетной записи пользователя 2 из передачи пользователя 1, чтобы создать такое представление (на основе типа карты):

-- Debit Balance Table
+---------+---------+
| user_id | balance |
+---------+---------+
| 1       | 30      |
| 2       | 70      |
+---------+---------+

-- Credit Balance Table
+---------+---------+
| user_id | balance |
+---------+---------+
| 1       | 0       |
| 2       | 20      |
+---------+---------+

Я знаю, что вы не можете добавлять деньги на кредитный счет, но пока просто забудьте об этой логике.

2
chinloyal 8 Ноя 2018 в 14:05

1 ответ

Лучший ответ

Для debit вы можете просто выполнить условное агрегирование:

SELECT 
  all_users.user_id, 
  SUM (CASE 
         WHEN t.transaction_type = 'deposit' AND all_users.user_id = t.from_id
           THEN ABS(t.amount) 
         WHEN t.transaction_type = 'transfer' AND all_users.user_id = t.from_id
           THEN -ABS(t.amount)
         WHEN t.transaction_type = 'transfer' AND all_users.user_id = t.to_id
           THEN ABS(t.amount)
         ELSE 0
       END
      ) AS balance 
FROM transactions AS t 
JOIN (
      SELECT from_id AS user_id FROM transactions 
      UNION 
      SELECT to_id FROM transactions
     ) AS all_users 
  ON t.from_id = all_users.user_id OR 
     t.to_id = all_users.user_id 
WHERE t.card_type = 'debit' 
GROUP BY all_users.user_id
1
Madhur Bhaiya 8 Ноя 2018 в 11:15