我想我明白了,你显然会确认。您的“availability_booking”中有一些记录,但不是一年中的每一天,只有那些可能有一些东西,而不是全部都承诺的,有些可能有,有些没有。
因此,您想模拟给定日期范围内的所有日期...假设 4 月 1 日至 7 月 1 日,因为有人希望在该时间段内预订派对。您不能说 4 月 27 日是开放的并且可用的,而不是预先填写您的生产表……因为不存在这样的记录。
要模拟日期范围的日历,您可以使用 MySQL 变量并加入数据库中的“任何”表,前提是它有足够的记录来模拟您想要的日期范围......
select
@myDate := DATE_ADD( @myDate, INTERVAL 1 DAY ) as DatesForAvailabilityCheck
from
( select @myDate := '2013-03-31' ) as SQLVars,
AnyTableThatHasEnoughRows
limit
120;
这只会为您提供从 2013 年 4 月 1 日开始的日期列表(原始 @myDate 是开始日期前 1 天,因为字段选择会增加 1 天以到达 4 月 1 日,然后继续...限制120 天(或任何您正在寻找的基于范围的 - 30 天、60、90、22 等等)。“AnyTableThatHasEnoughRows”实际上可能是您的“availability_booking”表,但我们只是将它用作带有行的表,没有 join 或 where 条件,仅够获得... 120 条记录。
现在,我们可以使用它来加入您想要的任何表并应用您的条件。您刚刚创建了一个完整的日历来进行比较。您的最终查询可能会有所不同,但这应该可以为您解决大部分问题。
select
JustDates.DatesForAvailabilityCheck,
from
( select
@myDate := DATE_ADD( @myDate, INTERVAL 1 DAY ) as DatesForAvailabilityCheck
from
( select @myDate := '2013-03-31' ) as SQLVars,
listing_availability
limit
120 ) JustDates
LEFT JOIN availability_bookable
on JustDates.DatesForAvailabilityCheck = availability_bookable.availability_date
where
availability_bookable.availability_date IS NULL
OR availability_bookable.availability_bookable = "Yes"
所以上面使用示例日历并查看可用性。如果不存在这样的匹配日期(通过 IS NULL),那么您想要它意味着没有冲突。但是,如果表中有记录,您只需要那些为“是”的记录,您可以预订它,文件中的条目可能不会被提交,并且可以在可用日期的结果查询中。