我需要找出已经预订或收到预订的用户。
我有两个看起来像这样的表:
用户:
+----+
| 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;
以及其他各种排列方式,但是我没有得到想要的结果。任何帮助将不胜感激。
答案 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