如何多次连接同一张表以选择不同的列?

时间:2019-01-21 15:36:00

标签: mysql sql

我需要找出已经预订或收到预订的用户。

我有两个看起来像这样的表:

用户:

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

预订:

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

预订有两个用户,一个“搭便车”(rid)和一个“所有者”(oid)。

每次预订的骑手和所有者不能相同,但骑手也可以是所有者。

我的输出应该是与已预订或收到预订的用户相对应的用户ID列表。

到目前为止我已经写

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 :(得分:0)

您应该可以在此处使用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

答案 1 :(得分:0)

您需要Bookings.rid或Bookdings.oid中的所有用户ID。因此,您可以执行以下操作:

select
  users.id
from
  users
where
  users.id in (select bookings.rid from bookings)
  or
  users.id in (select bookings.oid from bookings);

答案 2 :(得分:0)

  

我的输出应该是与已预订或收到预订的用户相对应的用户ID列表。

为此,您只需要查看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是日期间隔的开始和结束。

答案 3 :(得分:0)

我猜在name表中有一个Users列。
如果您也想要这样做,那么:

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

请参见demo
如果不是,则只需要扫描bookings表:

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

请参见demo