2016-04-19 13 views
0

私は初心者ですが、私はWeb開発の芸術を習得しようとしていて、SQLiteクエリのために自分の学習プロセスで惨めに失敗しています。空室状況チェックSQLiteクエリ

これは私のDBの設計です:

enter image description here

私が利用可能なお部屋を探したいが、私のクエリは、ちょうど私に正しい結果が得られていません!

SQLite DBに偽の予約を手動で入力し、すでに予約されているのと同じ日付のさまざまなクエリを実行しましたが、予約日はクエリ日の前後に実際に利用可能であるため、しかし、クエリの日付は重要な日付です!それは予約された部屋が全く現れてはならない理由です!しかし、私は正しいクエリを思い付くことができませんでした!

マイフェイク予約:

:2016年5月13日

に2016年5月10日から予約ルーム数101と

Aシングルルームこれは、これまでの私の「最高の」クエリです

SELECT * FROM Rooms NATURAL LEFT JOIN Booking WHERE RoomType='SR' AND 
Checkout IS NULL OR Arrival <= '2016-05-10' AND Checkout <= '2016-05-10' 
AND RoomType='SR' OR Arrival >= '2016-05-13' AND Checkout >= '2016-05-13' 
AND RoomType='SR' OR Arrival <> '2016-05-10' AND Checkout <> '2016-05-13' 
AND RoomType='SR'; 

SRは、私は、クエリを実行すると結果セットから完全に消えるためにRoomType(シングルルーム)

ルームナンバー101ニーズです!しかし、101は引き続き表示されます!

ArrivalおよびCheckoutフィールドは、SQLite DBにDATEのタイプです。

あなたは私を助けてくれますか?

また、私はPRAGMA Foreign KeysのことをPHPで正しく行っていますか?予約テーブルの得意先コードとルーム番号は外部キーです。

<?php 
$db = new PDO('sqlite:gshotel.db'); 
$db->exec('PRAGMA foreign_keys = ON;'); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
prepare... 
execute... 
?> 

は非常に多くの

+0

括弧を使用してください。あなたのWHERE句が(AとBとC)または(DとEとF)または...と仮定されていることを確かめましょう。また、同様に単純化すると、4回チェックしてRoomType = 'SR '、それは一度それをチェックする必要があります。 – Dresden

答えて

0

ありがとう、あなたが持っている4例を確認し、プラスそれらのすべての4のために確認してくださいRoomTypeの=「SR」を作ることを確認してください。あなたのクエリを単純化し、条件付きでグループ化が正しいことを確認するだけです。

SELECT * FROM Rooms 
NATURAL LEFT JOIN Booking 
WHERE Checkout IS NULL 
OR (Arrival <= '2016-05-10' AND Checkout <= '2016-05-10') 
OR (Arrival >= '2016-05-13' AND Checkout >= '2016-05-13') 
OR (Arrival <> '2016-05-10' AND Checkout <> '2016-05-13') 
AND RoomType='SR'; 
+0

こんにちは!私はちょうどあなたのバージョンを実行したが、まだ成功していない!予約された部屋はまだ表示されています:( – Zombievirus

+0

括弧が少なすぎます。 –

0

[OK]を私は全体の日を要したが、私は最終的にそれを掘ることができた!

SELECT * FROM Rooms NATURAL LEFT JOIN Booking WHERE 
    (
     Checkout IS NULL 
     AND RoomType='SR' 
    ) 
    OR (
     (
     '2016-05-10' NOT BETWEEN Arrival and Checkout 
    ) 
     AND (
     '2016-05-13' NOT BETWEEN Arrival and Checkout 
    ) 
     AND (
     Arrival NOT BETWEEN '2016-05-10' and '2016-05-13' 
    ) 
     AND (
     Checkout NOT BETWEEN '2016-05-10' and '2016-05-13' 
    ) 
     AND (
     RoomType='SR' 
    ) 
     AND (
     RoomNumber NOT IN (
      SELECT RoomNumber from Rooms NATURAL LEFT JOIN Booking WHERE 
       RoomType = 'SR' 
       AND (
        Arrival BETWEEN '2016-05-10' and '2016-05-13' 
        OR Checkout BETWEEN '2016-05-10' and '2016-05-13' 
        OR '2016-05-10' BETWEEN Arrival and Checkout 
        OR '2016-05-13' BETWEEN Arrival and Checkout 
       ) 
     ) 
    ) 
    ); 

このクエリはさらに簡素化できると確信していますが、現在はうれしいです!私はそれを広範囲にテストしました!