我很难根据存储在单独表格中的可用性来从位置表(例如酒店)中选择记录。为避免每个可能的日/位置组合都有大量可用性记录,可用性表仅保存给定日期的有限或无可用性记录 - 因此缺少匹配记录意味着有完全可用性。
表格有点像......
位置:id,name,maxRooms等。
可用性:locationID,date,roomsAvailable(从零开始的整数表示没有maxRooms的可用性)
...我需要做的是选择所有位置 - 在给定的日期期间 - 具有一定的可用性。这意味着它们要么没有匹配的可用性记录(即完全可用),要么它们的匹配可用性总和.roomsAvailable记录大于零。
我正在努力解释这个问题让我很头疼:-(感激不尽的任何想法......
答案 0 :(得分:2)
SELECT locations.id FROM locations LEFT JOIN availability
ON( locations.id = availability.locationID AND
( availability.roomsAvailable > 0 OR ISNULL( availability.locationID ) ) )
答案 1 :(得分:0)
您需要使用LEFT JOIN
答案 2 :(得分: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)
答案 3 :(得分:0)
感谢大家的建议。在考虑它们之后,我想出了这个组合的PHP / MySQL解决方案 - 它只适用于MySQL 4或更高版本......
SELECT * FROM locations 在哪里locations.id不在( SELECT distinct availability.locationID 从可用性 在哪里availability.date&gt; ='$ periodStartYMD' AND availability.date&lt; ='$ periodEndYMD' GROUP BY locationID 总和(availability.availableRooms)= 0 AND count(availability.locationID)= $ daysInPeriod)
PHP变量应该是自我解释的。
总结 - 如果可用性记录少于该期间中表示缺失日记录完全可用的天数。如果有记录,则表示没有或有限的可用性..
子选择语句获取与总可用性为零的位置匹配的所有可用性记录,以及(与我不同的位置)匹配记录的计数总计该期间的天数。
因此,如果每天都有可用性记录且总可用性计数为零,则整个期间必须没有可用的空间。
Phew - 希望能产生某种感觉并再次感谢......