Как объединить несколько таблиц в SQL - PullRequest
0 голосов
/ 15 декабря 2018

Привет, друзья! У меня есть 3 пополнения стола, снятие и передача этих 3 столов, принадлежащих столу пользователя.Я должен найти все записи, которые принадлежат пользователям.Я попытался с внутренним объединением следующим образом: -

SELECT * FROM users u
INNER JOIN topups t
  ON u.id = t.user_id
INNER JOIN withdraws w
  ON u.id = w.user_id
INNER JOIN transfers tf
  ON u.id = tf.user_id

Но этот запрос возвращает только общие записи между 3 таблицами.Мне нужно найти все записи, которые принадлежат пользователю для каждой таблицы.

Предположим, у меня есть 2 записи в topups, которые принадлежат идентификатору пользователя 1, 3 записи в отзыве, который принадлежит идентификатору пользователя 2 и 5 записей впередачи, принадлежащие идентификатору пользователя 3, поэтому я должен получить всего 10 записей.

пример данных: -

topups

+--------+---------+---------+
| amount | result  | user_id |
+--------+---------+---------+
|     10 | success |       1 |
|     20 | failed  |       2 |
+--------+---------+---------+

снимает

+---------+----------+
|w_amount |  user_id |
+---------+----------+
|     10  |        1 |
|     20  |        2 |
|     30  |       10 |
+---------+----------+

Переводы

+--------+--------+---------+
| method | amount | user_id |
+--------+--------+---------+
| abc    |     10 |       3 |
| xyz    |     20 |       4 |
+--------+--------+---------+

пользователей

+----+---------+--------+
| id |  f_name | l_name |
+----+---------+--------+
|  1 |    abc  |    xyz |
|  2 |    abc  |    xyz |
|  3 |    abc  |    xyz |
|  4 |    abc  |    xyz |
|  5 |    abc  |    xyz |
|  6 |    abc  |    xyz |
+----+---------+--------+

Ожидаетсявывод

+--------+---------+---------+----------+---------+
| amount | result  | user_id | w_amount |  method |
+--------+---------+---------+----------+---------+
|     10 | success |       1 |          |         |
|     20 | failed  |       2 |          |         |
|        |         |       1 |       10 |         |
|        |         |       2 |       20 |         |
|        |         |       3 |          | abc     |
|        |         |       4 |          | xyz     |
+--------+---------+---------+----------+---------+

Пожалуйста, помогите Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Оставлено присоединение их к пользователям и к числу работает для этого.

SELECT 
 tup.amount, tup.result, 
 usr.id as user_id, 
 wd.w_amount, 
 trans.method
FROM users usr
CROSS JOIN (SELECT generate_series n FROM generate_series(1, 3)) AS nr
LEFT JOIN topups tup ON tup.user_id = usr.id AND nr.n = 1
LEFT JOIN withdraws wd ON wd.user_id = usr.id AND nr.n = 2
LEFT JOIN transfers trans ON trans.user_id = usr.id AND nr.n = 3
WHERE (tup.user_id IS NOT NULL OR wd.user_id IS NOT NULL OR trans.user_id IS NOT NULL)
ORDER BY tup.user_id, wd.user_id, trans.user_id

Проверьте это здесь

Дополнительно:

Вариант, основанный на комментариях здесь

0 голосов
/ 15 декабря 2018

Вы можете использовать left join с вместо inner join с:

SELECT * FROM users u
LEFT JOIN topups t
  ON u.id = t.user_id
LEFT JOIN withdraws w
  ON u.id = w.user_id
LEFT JOIN transfers tf
  ON u.id = tf.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...