我有酒店预订系统,当用户输入一个新的预订日期和我需要检索所有未预订房间的时间段时,
预订表包含房间号、开始日期、期间
我写了这个查询,只是需要简化一下
select *
from rooms
where id in (
select room_id
from reservations
where '2018-6-11' not BETWEEN date_at and date_add(date_at, INTERVAL period day)
and '2018-6-30' not between date_at and date_add(date_at, INTERVAL period day)
and date_at not between '2018-6-11' and '2018-6-30'
and date_add(date_at ,INTERVAL period day ) not between '2018-6-11' and '2018-6-30' )
or id not in (select room_id from reservations)
3条答案
按热度按时间nzkunb0c1#
让我们把它分解成两个子问题。
把从来没有订过的房间都订了。
获取所有从不与预定房间时间冲突的房间。
在查询中,我假设
$start_date
以及$end_date
是存储有用户选择的值的php变量。gudnpqoy2#
你不需要做2
IN
查询。从你第一次IN
查询您只有NOT
子句,您可以将其更改为NOT IN
然后取下NOT
子查询中的。这也将删除第二个OR IN
.基本上,这个查询翻译成:给我所有没有预订的房间,我的开始或结束日期在预订时间之间。
编辑:
多亏了@vivekè23,我意识到不能根据内部where条件简化查询-尽管如此,这个版本将数据库的查询量减少到2。
brccelvz3#
转换呢
IN
子句转换为等价联接?如果在您的案例中有效,请参见下面的查询: