以下はあなたを動かすはずです。 「Current_Date()」関数のサンプルを、予約の開始日や外出日数に合わせて調整することをお勧めします。...
これは、クエリでMySQLインライン変数を使用します。内部クエリは、開始日(current_date())に基づく予約(@r)変数の単純な準備であり、アイテムテーブルに結合します。結合句を実行しないと、アイテムごとに1つの日付が取得されます。私のシナリオでは、30日間の外出のみを検討しているため、最初の30アイテムの制限を適用しました。十分なレコードを提供する以外の根拠はないので、30レコードの一時テーブルを作成する必要はありません(または、外出する日数は何日でも)。これにより、エイリアスクエリ「JustDates」が作成され、単一の列「OpenDate」が作成されます。これは、テストする日付範囲の基礎です。
これはアイテムテーブルに結合されましたが、すべてのアイテムと比較して、日付ごとにデカルト座標を作成する条件はありません... WHERE句に従って、SKUが「ABC123」の天気のアイテムのみに関係します。 #sまたは100。これにより、300または3000(30日で10個のシリアルアイテム、または30日で100個のシリアルアイテム)が可能になります。
これで、すべての個別のシリアル番号の「範囲」と空き状況を確認できる日数がわかったので、予約システムに対してクエリを実行できます。したがって、サブ選択を介して、指定された一致するSKU、シリアル番号、および予約で見つかった可能性のある日付に対してNOT INを使用して、指定された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