2017-07-19 3 views
-1

私は小さなホテルのオンラインルーム予約システムを作成しようとしています。データベース のテーブルの1つが予約を保持することになっています。それには、自動番号フィールド、顧客データフィールド、到着と出発の2つの日付フィールド、予約された部屋数のための番号フィールドがあります。 検索ページは到着日と出発日を結果ページに送信します。結果ページは、期間内に利用可能な部屋の数があれば顧客に通知することになっています。これはすべてがうまくいかないところです。 リクエストされた期間内にすでに予約されている部屋の数を正確にカウントできません。ホテルの空室状況に関するMysqlのクエリ

guest | arrive  | depart  |booked 
Smith | 2002-06-11 | 2002-06-18 | 1 
Jones | 2002-06-12 | 2002-06-14 | 2 
Brown | 2002-06-13 | 2002-06-16 | 1 
White | 2002-06-15 | 2002-06-17 | 2 

ホテルには9室の客室があり、利用可能な部屋の日数を日単位でリストしています。 このような結果が欲しいです。

date  available  status 
2002-06-10 | 9  | Hotel is empty 
2002-06-11 | 8  | Smith checks in 
2002-06-12 | 6  | Jones checks in 
2002-06-13 | 5  | Brown checks in 
2002-06-14 | 7  | Jones checks out 
2002-06-15 | 5  | White checks in 
2002-06-16 | 6  | Brown checks out 
2002-06-17 | 8  | White checks out 
2002-06-18 | 9  | Smith checks out 

ソリューション

+1

。 – csmckelvey

+0

これが表示の問題である限り、アプリケーションコードの問題の側面を処理することを検討してください。 – Strawberry

+0

また、(なぜ)同じ日数のゲストルームすべての部屋を予約する必要があります。 – Strawberry

答えて

1

1カレンダーテーブルを見つけるために私を助けてくださいこの種の問題のために厳密には必要ではないが、彼らは迅速かつ簡単な方法で問題を概念化することができます。だから私はあなたが現在、100%完璧な結果が得られないと、多分私達はあなたがそれを改善することができたを使用しているクエリを投稿してください4000まで1900年からの日付を保持しているカレンダーのテーブルを持っているし、何か...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(booking_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,guest VARCHAR(12) NOT NULL 
,arrive DATE NOT NULL 
,depart DATE NOT NULL 
,booked INT NOT NULL 
,UNIQUE KEY(guest,arrive) 
); 

INSERT INTO my_table (guest,arrive,depart,booked) VALUES 
('Smith','2002-06-11','2002-06-18',1), 
('Jones','2002-06-12','2002-06-14',2), 
('Brown','2002-06-13','2002-06-16',1), 
('White','2002-06-15','2002-06-17',2); 

SELECT x.dt 
    , 9 - COALESCE(SUM(booked),0) available 
    FROM calendar x 
    LEFT 
    JOIN my_table y 
    ON x.dt >= y.arrive AND x.dt < y.depart 
WHERE x.dt BETWEEN '2002-06-10' AND '2002-06-20' 
GROUP 
    BY dt; 
+------------+-----------+ 
| dt   | available | 
+------------+-----------+ 
| 2002-06-10 |   9 | 
| 2002-06-11 |   8 | 
| 2002-06-12 |   6 | 
| 2002-06-13 |   5 | 
| 2002-06-14 |   7 | 
| 2002-06-15 |   5 | 
| 2002-06-16 |   6 | 
| 2002-06-17 |   8 | 
| 2002-06-18 |   9 | 
| 2002-06-19 |   9 | 
| 2002-06-20 |   9 | 
+------------+-----------+ 
11 rows in set (0.00 sec) 
関連する問題