2017-04-08 65 views
0

我尝试创建一个查询,该查询在签入和结帐日期之间显示可用酒店。另外,当我预订特定房间时,我将其预订列设置为1.也就是说,当结帐日期实际发生时,触发功能会将预订列设置为0.按日期搜索Mysql查询

如果所有房间酒店预订(预订= 1)和这些房间的入住结帐日期是特定日期(入住结帐输入),然后不要将该酒店列入清单。我的查询不显示我想要的结果。

查询:输入:国家(州),登记和结帐。

SELECT DISTINCT a.* FROM accommodation a INNER JOIN cb_states s ON a.state = s.id 
INNER JOIN accommodation_rooms ar ON a.id = ar.accommodation 
WHERE state = 1 AND a.id NOT IN 
(
    SELECT 1 FROM booking b 
    WHERE 
    (
     (b.arrival_date BETWEEN '2017-11-16' AND '2018-03-16') 
     OR 
     (b.departure_date BETWEEN '2017-11-16' AND '2018-03-16') 
    ) 
) 

当我运行查询时,它总是显示所有酒店,不管日期。如果我写... WHERE ar.booked = 0 AND state = 1 AND a.id NOT IN...,那么它不显示住宿ID 13,但它不会显示当我更改日期。

收纳台: table 1

accommodation_rooms表: table 2

预订表: table 3

booked_rooms表:(有预订表的外键) table 4

回答

1

你有多 问题与您的查询:

  1. NOT IN名单有SELECT 1。这并没有给NOT IN列表种类繁多。
  2. 你的重叠逻辑是错误的。
  3. 我认为你需要将住宿房间连接到预定的住宿房间。

所以:

SELECT DISTINCT a.* 
FROM accommodation a INNER JOIN 
    cb_states s 
    ON a.state = s.id INNER JOIN 
    accommodation_rooms ar 
    ON a.id = ar.accommodation 
WHERE s.state = 1 AND 
     a.id NOT IN (SELECT br.accommodation_room 
        FROM booking b JOIN 
         booked_room br 
         ON b.?? = br.?? 
        WHERE b.arrival_date <= '2018-03-16' AND 
         b.departure_date >= '2017-11-16' 
       ); 
+0

可能是什么我的情况最好的逻辑是什么? –

+0

@MalenaT。 。 。这有逻辑修复。 '<='而不是'between'找到*任何*重叠。 –

+0

我明白了。谢谢,'b。? = br。??'在这里,我写了'b.id = br.booking',它仍然显示错误的结果。另外,我将住宿房间连接到了子查询中的预订房间'......加入了预订房间,并且再次显示错误的结果。 –