2011-08-04 40 views
1

我很難根據存儲在單獨表中的可用性從位置表(例如酒店)中選擇記錄。爲了避免爲每個可能的日期/地點組合提供大量可用性記錄,可用性表僅保存給定日期有限或無可用性的記錄 - 所以缺少匹配的記錄意味着存在全部可用性。MySQL根據記錄總數或另一個表中沒有記錄查詢一個表

表是有點像...

地點:ID,姓名,maxRooms等

可用性:locationID,日期,roomsAvailable(整數從零含義沒有可用性maxRooms)

...我需要做的是選擇所有位置 - 對於給定的日期 - 有一定的可用性。這意味着它們或者沒有匹配的可用性記錄(即完全可用)或它們的匹配可用性的總和。可用記錄大於零。

我越來越頭疼只是試圖解釋這種:-(任何想法感激地接受......

+0

我敢肯定,如果你告訴我們,與原始數據的一些表,然後期望的結果,你會更容易說明問題,並最有可能得到答案。 –

回答

2
SELECT locations.id FROM locations LEFT JOIN availability 
    ON(locations.id = availability.locationID AND 
     (availability.roomsAvailable > 0 OR ISNULL(availability.locationID))) 
0

我覺得你可以查詢這個樣子,得到的所有位置,其可用客房的總和大於0的特定日期,然後獲取未在可用性列出的所有位置。

SELECT * FROM locations 
WHERE id in 
(
    SELECT locationId 
    FROM availability 
    WHERE date >= '2011-05-01' and date <= '2011-07-01' 
    GROUP by locationId 
    HAVING SUM(roomsAvailable) > 0 
) 
OR id not in (SELECT DISTINCT locationId FROM availabilty) 
0

感謝你的S uggestions每個人。考慮到這些後,我想出了這個組合的PHP/MySQL的解決方案 - 這隻能在MySQL 4或更高版本...

SELECT * FROM位置WHERE locations.id NOT IN( SELECT DISTINCT availability.locationID FROM可用性 WHERE availability.date> = '$ periodStartYMD' AND availability.date < = '$ periodEndYMD' GROUP BY locationID HAVING SUM(availability.availableRooms)= 0 和COUNT(availability.locationID)= $ daysInPeriod)

PHP vars守ld是自我解釋的。

總結 - 如果可用性記錄少於指示缺失天數記錄的完全可用性的時間段中的天數。如果有記錄,則表示沒有或有限的可用性。

子選擇語句獲取匹配總可用性爲零和(避開我的位)匹配計數的位置的所有可用性記錄記錄該時期內的總天數。

因此,如果每天有可用性記錄,並且總可用性計數爲零,則整個期間都不得有空房。

唷 - 希望這是某種SENS並再次感謝的......

相關問題