【问题标题】:MySQL query one table based on sum of records or no records in another tableMySQL根据记录总和查询一张表或另一张表中没有记录
【发布时间】:2011-08-04 15:45:02
【问题描述】:

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

表格有点像……

位置:id、名称、maxRooms 等

availability: locationID, date, roomsAvailable(一个从零开始的整数,表示maxRooms没有空房)

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

我只是想解释这一点就头疼 :-( 任何想法都非常感谢...

【问题讨论】:

  • 我敢肯定,如果您向我们展示一些包含原始数据和预期结果的表格,您会更容易地陈述问题并很可能得到答案。

标签: mysql select join left-join


【解决方案1】:
SELECT locations.id FROM locations LEFT JOIN availability
    ON( locations.id = availability.locationID AND
        ( availability.roomsAvailable > 0 OR ISNULL( availability.locationID ) ) )

【讨论】:

    【解决方案2】:

    您需要使用LEFT JOIN

    【讨论】:

      【解决方案3】:

      我认为您可以这样查询,获取特定日期的可用房间总和大于 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)
      

      【讨论】:

        【解决方案4】:

        感谢大家的建议。在考虑了它们之后,我想出了这个 PHP/MySQL 组合解决方案——它只适用于 MySQL 4 或更高版本......

        选择 * FROM 位置 WHERE locations.id 不在( 选择不同的可用性.locationID 从可用性 WHERE availability.date >= '$periodStartYMD' AND availability.date

        PHP 变量应该是不言自明的。

        总结 - 如果可用记录的天数少于表示缺失天数记录完全可用的时间段内的天数。如果有记录,则表明没有或有限的可用性..

        子选择语句获取与总可用性为零的位置匹配的所有可用性记录,以及(让我忽略的一点)匹配记录的计数,总计该期间的天数。

        因此,如果每天都有空房记录,并且总空房数为零,则整个时段内一定没有空房。

        唷 - 希望这能有所帮助,再次感谢......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-25
          • 1970-01-01
          • 1970-01-01
          • 2019-08-30
          • 2013-04-22
          • 2012-01-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多