SQL小提琴 - http://sqlfiddle.com/#!9/16501a/1
我有这个查询,查找在用户输入的日期范围内未预订的房间:
select rooms.*
from rooms
where
(
rooms.id not in (
select room_id
from bookings
inner join statuses on statuses.id = status_id
where start <= '2018-01-16 11:00:00'
and end >= '2018-01-15 12:00:00'
and statuses.name in ('Approved', 'Completed')
)
)
;
-- 1st Query - No results due to clashes --
这完全正常,但我希望添加一些额外的逻辑,但我似乎无法让它工作。
作为房间预订流程的一部分,之后会填写一张检查表,此表格中有一个keys_returned_at
列,我想将此列添加到帐户中,并将该房间显示为可用,但前提是它没有与现有预订发生冲突。
我尝试在上面添加以下内容:
-- this is the new part --
or (
rooms.id in (
select room_id
from bookings
inner join statuses on statuses.id = status_id
inner join checksheets on checksheets.booking_id = bookings.id
where start <= '2018-01-16 11:00:00'
and end >= '2018-01-15 12:00:00'
and statuses.name = 'Completed'
and checksheets.completed = 1
and checksheets.keys_returned_at <= '2018-01-16 11:00:00'
)
)
这似乎主要起作用,但并不限制可能存在于数据库中的任何现有预订,因此当不应该发生冲突时,它会返回结果中的空间。
e.g。示例预订可能是:
房间
id | start | end | status_id | room_id
--------------------------------------------------------------------
1 | 2018-01-15 08:00:00 | 2018-01-16 08:00:00 | 1 | 1
2 | 2018-01-15 11:00:00 | 2018-01-17 08:00:00 | 1 | 1
检查表
id | room_id | keys_returned_at
----------------------------------
1 | 1 | 2018-01-15 10:00:00
示例搜索条件为2018-01-15 12:00:00
到2018-01-16 12:00:00
。
如果只预订一个在数据库中,那么应该在结果中返回房间1,因为它不会与搜索字词冲突,因为它在keys_returned_at
时间戳之后开始(并且结束没有冲突)与任何其他预订,只是没有任何其他预订),但是,当涉及预订两个时,由于搜索开始日期是start
预订日期2
之后,因此不应返回可用性。