[英]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一直出現!
Arrival
和Checkout
字段在 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.