1

预订表:

  id  | fk_property_id |       arrival       |      departure      
------+----------------+---------------------+---------------------
 1    |            1   | 2013-01-11 14:00:00 | 2013-09-07 10:00:00
 2    |            1   | 2013-02-12 14:00:00 | 2013-09-07 10:00:00
 3    |            1   | 2013-03-29 14:00:00 | 2013-09-07 10:00:00
 4    |            2   | 2013-04-29 14:00:00 | 2013-09-07 10:00:00
 5    |            2   | 2013-05-29 14:00:00 | 2013-09-07 10:00:00
 6    |            3   | 2013-06-29 14:00:00 | 2013-09-07 10:00:00

属性表:

 id  |                         title                          
-----+--------------------------------------------------------
 1   | blah blah
 2   | blah blah
 3   | blah blah
 4   | blah blah
 5   | blah blah
 6   | blah blah
 7   | blah blah
 8   | blah blah
 9   | blah blah
 10  | blah blah

我需要列出特定日期范围内可用的属性。

例如用户输入日期范围:到达:2013-06-29 14:00:00 出发:2013-07-14 10:00:00

我需要列出该期间所有未出租的房产。我怎么做?
我认为它应该是一个左连接 - 但我无法绕过它。

4

3 回答 3

2

这是正确的条件:

select p.*
from properties p left outer join
     reservations r
     on p.id = r.fk_property_id and
        r.arrival < '2013-07-14 10:00:00' and
        r.departure > '2013-06-29 14:00:00'
where r.id is null

这是逻辑。首先,时间条件需要放在on子句中。在where子句中,它们与left outer join.

逻辑是,如果在较晚日期之前没有到达并且在第一个日期之后没有离开,那么房间在所有日子都是可用的。这考虑了所有不同的重叠可能性。

finalwhere只查找可用的属性,因为没有保留。

于 2013-02-13T04:31:05.327 回答
1

有几种方法:

左连接

SELECT p.id, p.title
FROM properties p 
LEFT JOIN reservations r 
on p.id = r.fk_property_id 
where arrival < '2013-06-29 14:00:00'
and departure > '2013-07-14 10:00:00'
and r.id is null

但是,由于您实际上是在执行反半连接,NOT EXISTS因此可能对您更好:

select p.id, p.title
from properties p 
where NOT EXISTS (
    select 1 
        from reservations r 
            where where arrival > '2013-06-29 14:00:00'
                 and departure < '2013-07-14 10:00:00'
                 and p.id = r.fk_property_id);
于 2013-02-13T04:21:44.640 回答
0

你会想IS NULL用你的LEFT OUTER JOIN桌子。这意味着在该特定属性的保留表中未找到任何内容。

SELECT *
FROM properties LEFT OUTER JOIN reservations ON properties.id =     reservations.fk_property_id AND a
WHERE arrival > '2013-06-29 14:00:00'
AND departure < '2013-07-14 10:00:00'
AND reservations.arrival IS NULL
于 2013-02-13T04:22:22.480 回答