2011-04-04 20 views
0

我意識到這個問題已經以各種形式提出,但我正在努力將其實現應用到我的應用程序中。正確的mySQL語句搜索可用性日期

這裏是我的表設置:

home: home_id, booking_id, name, address, location, etc 
booking: booking_id, fromdate, todate 

我想建立一個搜索將返回家中的可用性。因此,如果家庭「A」未從「2011年4月4日 - 2011年4月4日」預訂,那麼它將返回家「A」作爲結果。

感謝您的幫助。

好了,基於什麼你們說我所做的調整,以我的表正常化他們,然後我的PHP中使用下面的查詢:

SELECT home.home_id,home.name,回家。地址 從家 左加入(SELECT home_id FROM booking where where BETWEEN'2011-04-06'AND'2011-04-07' OR todate BETWEEN'2011-04-06'AND'2011-04-07 ')booking ON home.home_id = booking.home_id WHERE booking.home_id IS NULL

但是,當我在預訂表中使用上述示例返回「booking_id = 1」,「home_id = 1」,「from_date = 2011-03-31」,「to_date = 2011-04-10」這一排我不想要。我將嘗試使用大於值來查看是否可以解決問題。

+0

到目前爲止你有什麼嘗試? – 2011-04-04 17:31:25

回答

1
SELECT H.home_id, H.name, H.address, H.location 
FROM Home H 
LEFT JOIN (SELECT booking_id 
      FROM booking 
      WHERE @fromdate BETWEEN fromdate AND todate 
      OR @todate BETWEEN fromdate AND todate) B 
ON H.booking_id = B.booking_id 
WHERE B.booking_id IS NULL 
1

它不會工作,除非你以一個規範化的數據庫 - 你目前的架構是沒有意義的 - 大概是一個家可以有多個預約 - 但你似乎已經booking_id如家表引用的外鍵預訂 - 這應該是另一種方式(預訂應參考home_id)。

使用正確的模式:

SELECT home.* 
FROM home h 
WHERE NOT EXISTS (
    SELECT 1 FROM booking b 
    WHERE b.end_date>$start_time 
    AND b.start_date<$end_time 
    AND b.home_id=h.home_id 
); 

SELECT home.* 
FROM home h 
LEFT JOIN booking b 
ON (b.home_id=h.home_id 
    AND b.end_date>$start_time 
    AND b.start_date<$end_time 
) 
WHERE b.home_id IS NULL; 

隨着指數上預訂(START_TIME,END_TIME,HOME_ID)應該是相當有效的。