1

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

どんな助けやアドバイスも大歓迎です。

アップデート;

私の言い回しは少し不明瞭かもしれないと思います。私がやろうとしているのは、特定の日付範囲(検索日)で賃貸可能な物件のリストを取得することです。次の場合、プロパティは利用できません。検索日は既存の予約日の範囲内であるか、どちらかの端で重複しています。検索日の間の期間をカバーする予約がない場合、プロパティは利用可能です。

4

2 に答える 2

0

このようなものが必要ですか?:

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 IN (1, 2, 3, 6)) 
        AND (b.end_date BETWEEN '2012-12-01' AND '2012-12-30'
        OR b.start_date BETWEEN '2012-12-01' AND '2012-12-30')
) 
ORDER BY p.title ASC;

2と3を返します

于 2012-12-04T16:41:04.237 に答える
0

ここでそれを解決することができたのはフィドルです:http://sqlfiddle.com/#!2/d02e1/64

于 2012-12-04T19:01:18.020 に答える