以下内容可以帮到你.您可能想要调整我的“Current_Date()”函数样本,无论您的预订开始日期是多少都可以出去……
这在查询中使用MySQL内联变量.内部查询是基于某个开始日期(current_date())的预留(@r)变量的简单准备,并且连接到项目表.通过不执行join子句,它将为每个项目获取一个日期.在我的场景中,我只考虑外出30天,所以我已经应用了前30项的限制.除了给我足够的记录之外没有基础,所以我不必创建一个包含30条记录的临时表(或者你想要出去多少天).这将创建别名查询“JustDates”并具有单个列“OpenDate”.这是要测试的日期范围的基础.
这现在加入了items表,但没有条件为每个日期创建一个笛卡尔说,与每个项目进行比较…根据WHERE子句,我只关心SKU为“ABC123”天气他们有10个序列的项目#s或100.这将给我一个可能的300或3000(30天的10个连续项目,或30天的100个连续项目).
现在我有一个所有单个序列号的“范围”和可能的日期来检查可用性,我现在可以查询预订系统.因此,通过子选择和NOT IN来获得给定的匹配SKU,SERIAL#和在预订中找到的可能日期,我只想保留那些找不到给定OpenDate的日期.我已经模拟了你的桌子结构,并放入了一些项目,多个序列号和滞留的预订日期范围,它很棒…
显然,我会确保sku / serial上的索引的性能.我可能进行的唯一额外更改是查询预订时,排除任何结束日期在您的查询的起始日期之前的预订,并且可选地,没有开始日期>你正在考虑的最后一个日期.如果您有多年的保留意见,那么他们会关注某些古老的东西,或者从未来的日期范围开始.
select items.sku,
items.serial_number,
JustDates.OpenDate
from
( SELECT
@r:= date_add(@r, interval 1 day ) OpenDate
FROM
(select @r := current_date()) vars,
items limit 30 ) JustDates,
items
where
sku = "ABC123"
and sku not in ( select sku from Reservations
where items.sku = reservations.sku
and items.serial_number = reservations.serial_number
and justDates.OpenDate >= reservations.start_date
and justDates.OpenDate <= reservations.end_date )
order by
items.serial_number,
justDates.OpenDate