私はこれをいくつかの場所で探しましたが、必ずしも正しい答えを見つけたわけではありません。
指定された時間範囲で利用可能なプロバイダーを照会しようとしています。date_startとdate_endを持つすべての古い予約を含む1つの列があります。基本的に、予約したい場合は、プロバイダーが利用可能であることを確認する必要があります。これまでのところ、クエリは機能し、次のようになります。
SELECT a.provider a
FROM l_provider_zip a
(several inner Joins and conditions)
WHERE a.zip = :zip
AND a.provider_id
NOT IN (
SELECT da.provider_id
FROM booking da
WHERE da.provider_id IS NOT NULL
AND (
( :start BETWEEN da.date_start AND da.date_end)
OR ( :end BETWEEN da.date_start AND da.date_end)
OR ( da.date_start BETWEEN :start AND :end )
)
)
私の懸念は、新しい予約に利用できるプロバイダーを見つけるために、新しい予約が別の予約と競合しないことを確認する必要があるということです。ここにそれを理解するための3つの条件ステートメントがあります。
- :start(新規予約の)da.date_startとda.date_endの間
- :end(新規予約の)da.date_startとda.date_endの間
- da.date_start BETWEEN:start AND:end(別の予約が新しい予約の開始または終了にありません)
これは非常に非効率的なようですが、私はより良い方法を見つけることができません。もちろん、インデックスを作成することで効率を上げることができますが、この操作を実行するためのより良い方法があります。これは私のプロジェクトにとって非常に中心的な質問であり、多くの人が直面し続けている問題かもしれないと思います。再度、感謝します!