簡體   English   中英

房間可用性檢查 SQLite 查詢

[英]Room Availability check SQLite Query

我是一個新手,但我正試圖掌握 Web 開發的藝術,但由於 SQLite 查詢而在我的學習過程中慘遭失敗。

這是我的數據庫設計:

在此處輸入圖片說明

我想尋找可用的房間,但我的查詢沒有給我正確的結果!!!

我用虛假預訂手動填充 SQLite 數據庫,然后針對已預訂的完全相同的日期運行各種查詢,但預訂的房間一直顯示為可用,因為它確實在查詢日期之前和之后可用! 但是查詢日期是重要的日期! 這就是為什么預訂的房間根本不應該出現的原因! 但我無法提出正確的查詢!

我的假預訂:

2016年5月10日至2016年5月13日預訂101號房的單人房

到目前為止,這是我的“最佳”查詢:

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 外鍵操作? Booking 表中的 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...
?>

非常感謝

確保您檢查了您擁有的 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';

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

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

我很確定這個查詢可以進一步簡化,但現在,我很高興它有效! 我對它進行了廣泛的測試!

這是一篇舊帖子,但我最近找到了它,因為我從這篇文章中汲取了一些想法,所以我想分享我遇到的解決方案,並且僅適用於 jine。

SELECT RoomNumber From Rooms WHERE RoomNumber NOT IN
        (SELECT RoomNumber FROM Booking WHERE (('2016-05-10' BETWEEN 
        Arrival AND CheckOut) OR ('2016-05-13' BETWEEN Arrival AND 
        CheckOut) OR (CheckIn BETWEEN '2016-05-10' AND '2016-05-13') OR 
        (CheckOut BETWEEN '2016-05-10' AND '2016-05-13'))) AND 
        Roomtype = "SR"

這是開始時使用左連接的另一個查詢,但這種方式很實用,至少從我的角度來看不是這樣。

SELECT * From Rooms LEFT JOIN Booking ON Rooms.RoomNumber = 
        Booking.RoomNumber WHERE Rooms.NumeroHAB NOT IN
        (SELECT Booking.RoomNumber FROM Booking WHERE (('2016-05-10' BETWEEN 
        Arrival AND CheckOut) OR ('2016-05-13' BETWEEN Arrival AND 
        CheckOut) OR (Arrival BETWEEN '2016-05-10' AND '2016-05-13') OR 
        (CheckOut BETWEEN '2016-05-10' AND '2016-05-13'))) AND 
        RoomType = "SR" ORDER BY Rooms.RoomNumber ASC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM