Как объединить одну и ту же таблицу более одного раза, чтобы выбрать разные столбцы? - PullRequest
0 голосов
/ 21 января 2019

Мне нужно найти пользователей, которые сделали или получили бронирование.

У меня есть две таблицы, которые выглядят так:

Пользователи:

+----+
| id |
+----+
| 1  |
| 2  |
| 3  |
+----+

Заказы:

+----+-----+-----+
| id | rid | oid |
+----+-----+-----+
| 1  | 1   | 2   |
| 2  | 2   | 1   |
| 3  | 3   | 4   |
+----+-----+-----+

В бронировании участвуют два пользователя: «наездник» (избавленный) и «владелец» (oid).

Наездник и владелец не могут быть одинаковымидля каждого бронирования, но райдеры также могут быть владельцами.

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

Пока я написал

select u.id, b1.rid, b2.oid
from users u
left join bookings b1
on u.id = b1.rid
left join bookings b2
on u.id = b2.oid;

И другие различные перестановки, но я не получаю желаемого результата.Любая помощь будет оценена.

Ответы [ 4 ]

0 голосов
/ 21 января 2019

Полагаю, в таблице Users есть столбец name.
Если вы тоже этого хотите, то:

select users.id, users.name from (
  select rid userid from bookings
  union
  select oid userid from bookings
) t inner join users
on users.id = t.userid
group by users.id, users.name

См. Демоверсию
Если нет, вам нужно только отсканировать таблицу bookings:

select distinct userid from (
  select rid userid from bookings
  union
  select oid userid from bookings
) t 

См. Демоверсию

0 голосов
/ 21 января 2019

Вы хотите, чтобы все идентификаторы пользователей были либо в Bookings.rid, либо в Bookdings.oid. Так что вы можете сделать что-то вроде:

select
  users.id
from
  users
where
  users.id in (select bookings.rid from bookings)
  or
  users.id in (select bookings.oid from bookings);
0 голосов
/ 21 января 2019

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

Для этого вам нужно только взглянуть на bookingsтаблица:

SELECT DISTINCT rid id FROM bookings
UNION ALL SELECT DISTINCT oid FROM bookings

DISTINCT удаляет дубликаты, возвращаемые каждым запросом, а UNION ALL удаляет дубликаты по обоим запросам.

Если вы хотите выполнить фильтрацию по временному интервалу:

SELECT DISTINCT rid id FROM bookings WHERE some_date BETWEEN :start_date AND :end_date
UNION ALL SELECT DISTINCT oid FROM bookings WHERE some_date BETWEEN :start_date AND :end_date

Где some_date - это поле, содержащее дату бронирования, а :start_date / end_date - начало и конец интервала дат.

0 голосов
/ 21 января 2019

Вы должны быть в состоянии использовать предложение UNION здесь.Однако вы не определяете, что такое «временное окно», поэтому я не уверен, что мы сможем предложить вам полное решение.Однако попробуйте что-то вроде следующего:

SELECT
    users.id,
    bookings.rid,
    bookings.oid
FROM
    users
        LEFT JOIN bookings ON users.id = bookings.rid

UNION ALL

SELECT
    users.id,
    bookings.rid,
    bookings.oid
FROM
    users
        LEFT JOIN bookings ON users.id = bookings.oid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...