2016-09-25 12 views
0

私は予約されたホテルの部屋をユーザーが指定したdaterangeに従って取得しようとしています。2つのデータ範囲の間の特定のレコードを選択

私は列を持つ2つのテーブル

  • 部屋

    このクエリを適用イムcheckoutdate

、列を持つ

  • 予約は、checkindateをroom_idをreserv_id、roomnoをroom_id持っています
    $sql = "SELECT DISTINCT roomno 
    FROM rooms 
    LEFT JOIN reservation ON rooms.room_id = reservation.room_id 
    AND 
    (
        (
         (reservation.checkindate > '$newreservcheckin') 
         AND 
         (reservation.checkindate > '$newreservcheckout') 
        ) 
        OR 
        (
         (reservation.checkoutdate < '$newreservcheckin') 
         AND 
         (reservation.checkoutdate < '$newreservcheckout') 
        ) 
    )"; 
    

    $ newreservcheckoutはユーザー

    が提供する日付範囲です$ newreservcheckinとのは、私たちは今、100と101 100としてroomno付きの客室を持っているとしましょう2016年9月16日から2016年9月18日 に計上されますまた、100は9-27-2016から9-29-2016まで で予約され、部屋101は予約されていません(予約テーブルにレコードがないことを意味します)

    9-26-2016から9- 30-2016のクエリでは、9-27-2016から9-29-2016までの部屋の100番のエントリは無視されますが、9-16-2016から9-18-2016までの日付の部屋は100と表示されますndは101室を表示します

    同じ部屋ではなく、異なる日付のものを与えるようにクエリを成形する方法は?

  • 答えて

    0

    :ここ

    select no from room r 
    where not exists (
        select id from reservation where room_id = r.id) 
    
    union 
    
    select no from room r 
    where r.id not in (
        select distinct room_id from reservation 
        where 
         checkindate between '2016-09-20' and '2016-09-22' 
        OR 
         checkoutdate between '2016-09-20' and '2016-09-22' 
    ) 
    

    ですSQL Fiddle

    0

    新しいチェックの日付と重複するすべての予約に参加し、参加しない部屋を選択することができます。私の質問では、新しいゲストは前回と同じ日にチェックインできると期待しています。そうでない場合は、「<」を「< =」に、「>」を「> =」に変更します。

    あなたは、クエリが動作するはずの下に、予約または(B)予約されたが、範囲外のあなたが照会されるわけではありません(A)のどちらかである部屋を選択する必要が
    SELECT 
        r.roomno 
    FROM 
        rooms r 
         LEFT JOIN 
        reservations res ON res.room_id = r.room_id 
         AND res.checkindate < '$newreservcheckout' 
         AND res.checkoutdate > '$newreservcheckin' 
    WHERE res.reserv_id IS NULL 
    
    関連する問題