2016-04-19 82 views
0

我是一個新手,但我正在努力掌握Web開發的藝術,並在我的學習過程中由於SQLite查詢錯誤地失敗。房間可用性檢查SQLite查詢

這是我的數據庫設計:

enter image description here

我想看看可用客房,但我只是查詢不給我正確的結果!

我使用假預訂手動填充了SQLite數據庫,然後對已經預訂完全相同的日期進行了各種查詢,但預訂的房間一直顯示爲可用,因爲它在查詢日期前後確實可用!但查詢日期是重要日期!這就是爲什麼預訂的房間不應該出現!但我無法提出正確的查詢!

我的假訂票:

一個房間與房間數101從2016年5月10日預訂到2016年5月13日

這是我的「最佳」到目前爲止查詢:

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不斷出現!

ArrivalCheckout字段在SQLite數據庫中的類型爲DATE

你們能幫我嗎?

而且,我在PHP中正確執行PRAGMA外鍵事情嗎?預訂表中的CustomerID和RoomNumber是外鍵。

<?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例必須加上確保RoomType =「SR」對他們的所有4。只是簡化你的查詢並確保分組對於條件是正確的。

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

好吧,我花了整整一天,但我終於設法破解它!

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 
       ) 
     ) 
    ) 
    ); 

我很確定這個查詢可以進一步簡化,但現在,我很高興它的工作原理!我廣泛地測試了它!