2011-08-04 39 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并再次感谢的......

相关问题