2つのデータベーステーブルがあります。1つはプロパティを格納し、もう1つはプロパティの予約を格納します。テーブル構造の簡略化されたバージョンは次のとおりです。
property
+-------------------+--------------+
| Field | Type |
+-------------------+--------------+
| id | int(11) |
| status | int(1) |
| title | varchar(150) |
+-------------------+--------------+
booking
+-------------------+--------------+
| Field | Type |
+-------------------+--------------+
| id | int(11) |
| status | int(1) |
| property_id | int(11) |
| start_date | date |
| end_date | date |
+-------------------+--------------+
開始日と終了日が記載された検索フォームがあり、特定の期間に利用できるプロパティを確認できます。例:「2012年12月1日から2012年12月7日までの間に賃貸可能な物件」。
私はある程度機能する次のSQLを持っています:
SELECT p.id, p.title FROM property p WHERE p.status=1 AND p.id NOT IN (SELECT
b.property_id FROM booking b WHERE (b.status=1 OR b.status=2 OR b.status=3 OR
b.status=6) AND NOT (b.enddate < '2013-05-30' OR b.startdate > '2013-05-24'))
ORDER BY p.title ASC
問題は、日付の重複を処理しないことです。既存の予約内の日付範囲を検索する場合、SQLは正常に機能し、プロパティは返されません。ただし、検索日が予約日と重なっている場合は、検索期間の一部で予約されていても、プロパティは返されます。
ここでSQLフィドルを設定しました:http ://sqlfiddle.com/#!2/ d02e1 /4-クエリは5つあります-最初の2つは問題ありません。返される必要のあるプロパティは次のとおりです。
- クエリ1(動作中)-1、2、および3
- クエリ2(動作中)-2および3
- クエリ3(機能しない)-2および3
- クエリ4(機能しない)-2および3
- クエリ5(機能しない)-2および3
どんな助けやアドバイスも大歓迎です。
アップデート;
私の言い回しは少し不明瞭かもしれないと思います。私がやろうとしているのは、特定の日付範囲(検索日)で賃貸可能な物件のリストを取得することです。次の場合、プロパティは利用できません。検索日は既存の予約日の範囲内であるか、どちらかの端で重複しています。検索日の間の期間をカバーする予約がない場合、プロパティは利用可能です。