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ます。

ロジックは、後の日付より前に到着せず、最初の日付より後に出発しない場合、すべての日に部屋が利用可能であるということです。これにより、さまざまなオーバーラップの可能性がすべて考慮されます。

最終的whereには、予約がないために利用可能なプロパティを見つけるだけです。

于 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 に答える