MySQL根据记录总数查询一个表,或者在另一个表中没有记录

时间:2011-08-04 15:45:03

标签: mysql select join left-join

我很难根据存储在单独表格中的可用性来从位置表(例如酒店)中选择记录。为避免每个可能的日/位置组合都有大量可用性记录,可用性表仅保存给定日期的有限或无可用性记录 - 因此缺少匹配记录意味着有完全可用性。

表格有点像......

  

位置:id,name,maxRooms等。

     

可用性:locationID,date,roomsAvailable(从零开始的整数表示没有maxRooms的可用性)

...我需要做的是选择所有位置 - 在给定的日期期间 - 具有一定的可用性。这意味着它们要么没有匹配的可用性记录(即完全可用),要么它们的匹配可用性总和.roomsAvailable记录大于零。

我正在努力解释这个问题让我很头疼:-(感激不尽的任何想法......

4 个答案:

答案 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 - 希望能产生某种感觉并再次感谢......