2017-10-31 13 views
0

オンラインルームの予約システムを作成しようとしています。部屋の可用性チェックのSQLクエリ

データベースのテーブルの1つが予約を保持することになっています。自動番号フィールド、顧客データフィールド、到着と出発の2つの日付フィールド、およびその他のテーブルの予約の詳細は、bookedid、roomidおよびroom countです。

検索ページは、到着と出発日を結果ページに提示します。結果ページは、期間内に利用可能な部屋の数があれば顧客に通知することになっています。これはすべてがうまくいかないところです。私はちょうど要求された期間内に既に予約された部屋の数を正確に数えることができません。

予約テーブル

 
id|guest | arrive  | depart  
1 |Smith | 2017-12-20 | 2017-12-25 
2 |Jones | 2017-12-21 | 2017-12-25 
3 |Brown | 2017-12-23 | 2017-12-27 
4 |White | 2017-12-24 | 2017-12-26 

予約の詳細テーブルテーブル

 
id  | booked_id | room_id |room_count 
1  | 1   | 1  | 2 
2  | 1   | 2  | 2 
3  | 2   | 1  | 4 
4  | 3   | 2  | 2 
5  | 3   | 1  | 2 
6  | 4   | 1  | 2 

ルーム - ルームroom_idはここから来ています。

 
room_id | type  | count |amount 
1  | Single room | 10  | 1000 
2  | Deluxe room | 5  | 2000 

私は(例のために:room_idは1である)特定の部屋の可用性をしたい

 
date  available  roomid 
2017-12-20 | 8  | 1 
2017-12-21 | 4  | 1 
2017-12-22 | 4  | 1 
2017-12-23 | 2  | 1 
2017-12-24 | 0  | 1 
2017-12-25 | 0  | 1 
2017-12-26 | 4  | 1 
2017-12-27 | 8  | 1 
2017-12-28 | 10  | 1 
2017-12-25 | 10  | 1 

私はまた、カレンダーのテーブルを使用しています。私は

のようなクエリを書いています
SELECT x.dt , r.room_cnt - COALESCE(SUM(d.`booking_cnt`),0) available 
FROM calendar_table x 
LEFT JOIN bookings y ON x.dt >= y.`date_from` AND x.dt < y.`date_to` 
LEFT JOIN booking_details d ON d.booking_id=y.id 
LEFT JOIN rooms r ON r.id= 1 
WHERE x.dt BETWEEN now() AND now() + interval 3 month GROUP BY dt 

これは正しく動作していません。

+0

をこのようなクエリを変更します。 – bumperbox

+0

私はこの行を推測しています。 '

+0

'x.dtとy.date_fromとy.date_to'の間にも有効です。 –

答えて

1

は、多分あなたはあまりにもカレンダーのテーブルの構造を表示する必要があり、予約した部屋にゲストをリンクする方法はありません、

SELECT x.dt , r.room_cnt,SUM(d.`booking_cnt`) booked,r.room_cnt- SUM(d.`booking_cnt`) available FROM calendar_table x 
LEFT JOIN bookings y ON x.dt >= y.`date_from` AND x.dt < y.`date_to` 
LEFT JOIN booking_details d ON d.booking_id=y.id and d.room_id='1' 
LEFT JOIN rooms r ON r.id= 1 
WHERE x.dt BETWEEN now()-interval 3 month AND now() + interval 3 month GROUP BY dt 
+0

これは参考になります。それをさらに良くするために(そしてあなたの将来の答えの一般的なアドバイスとして)、あなたが変更したものの説明を追加することを検討しますか?あなたの戦略/アプローチは何でしたか?将来の読者は、回答のコードと質問のコードとの間のクリティカルな違いに注意を向けると、最も効果的です。ありがとう! – halfer

関連する問題