私は理解していると思います、そしてあなたは明らかに確認するでしょう。「availability_booking」にはいくつかのレコードが含まれていますが、1年の毎日ではなく、何かを持っている可能性のあるものだけがあり、すべてがコミットされているわけではありません。
したがって、指定された日付範囲内のすべての日付をシミュレートする必要があります...誰かがその期間内にパーティーを予約しようとしているので、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日前です。これは、フィールドの選択により4月1日までに1日が追加され、その後も制限が続くためです。 120日(または範囲ベースで探しているもの-30日、60、90、22など)。「AnyTableThatHasEnoughRows」は実際には「availability_booking」テーブルである可能性がありますが、行を含むテーブルとして使用しています。参加なしまたは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を介して)存在しない場合は、競合がないことを意味します。ただし、テーブルにレコードがある場合は、YESのレコードのみが必要であり、予約できます。ファイルのエントリはコミットされない可能性があり、使用可能な日付の結果クエリに含めることができます。