2012-12-04 49 views
0

我有兩個數據庫表,一個存儲屬性,另一個存儲屬性的預約。下面是表結構的簡化版本:SQL'Check Availability'語句

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

任何幫助或建議是非常讚賞。

UPDATE;

我想我的措辭可能有點不清楚。我想要做的是獲取可用於租賃的特定日期範圍(搜索日期)的屬性列表。如果有財產將不可用;搜索日期在現有預訂日期範圍內,或者在任一端重疊。如果沒有涵蓋任何搜索日期之間的預訂,則該酒店可用。

回答

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

+0

這幾乎得到了它,但現在如果你有搜索在現有預訂日期範圍內的日期,該屬性在它不應該出現時出現(即屬性1不應出現在本示例中的任何查詢中:http://sqlfiddle.com/#!2/d02e1/45) – gbuckingham89

+0

我認爲我的措辭可能有點不清楚。我想要做的是獲取可用於租賃的特定日期範圍(搜索日期)的屬性列表。如果有財產將不可用;搜索日期在現有預訂日期範圍內,或者在任一端重疊。如果沒有涵蓋任何搜索日期之間的預訂,則該酒店可用。 – gbuckingham89