0

私はこれをいくつかの場所で探しましたが、必ずしも正しい答えを見つけたわけではありません。

指定された時間範囲で利用可能なプロバイダーを照会しようとしています。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つの条件ステートメントがあります。

  1. :start(新規予約の)da.date_startとda.date_endの間
  2. :end(新規予約の)da.date_startとda.date_endの間
  3. da.date_start BETWEEN:start AND:end(別の予約が新しい予約の開始または終了にありません)

これは非常に非効率的なようですが、私はより良い方法を見つけることができません。もちろん、インデックスを作成することで効率を上げることができますが、この操作を実行するためのより良い方法があります。これは私のプロジェクトにとって非常に中心的な質問であり、多くの人が直面し続けている問題かもしれないと思います。再度、感謝します!

4

2 に答える 2

2

私があなたの質問を理解した場合、あなたはこの予約に利用できるプロバイダー、つまりこの予約と衝突する予約を持っていないプロバイダーを探しています。したがって、この予約と競合するすべての予約を見つけるには、予約を探す必要があります

- where the booking start date is on or before the new booking end date, and
- where the booking end date is on or after the new booking start date

したがって、次のように変換されるサブクエリの場合

 SELECT da.provider_id
 FROM booking da
 WHERE da.provider_id IS NOT NULL
   AND da.date_start <= :end 
   AND da.date_end   >= :start
于 2012-05-02T16:49:19.037 に答える
1

指定された日付範囲の予約にプロバイダーを参加させ、それらのプロバイダーが取得されたため除外します。

/* Select all providers */
SELECT *
FROM l_provider_zip p
/* Providers with bookings that start in the middle of our date range are busy */
LEFT JOIN booking b1
  ON b1.provider_id = p.provider_id
  AND b1.date_start BETWEEN :start AND :end
/* Providers with bookings that end in the middle of our date range are busy */
LEFT JOIN booking b2
  ON b2.provider_id = p.provider_id
  AND b2.date_end BETWEEN :start AND :end
/* Exclude those providers with bookings in our date range */
WHERE b1.provider_id IS NULL
  AND b2.provider_id IS NULL

サブクエリは必要ありません!このクエリを適切に実行するためにインデックスについてサポートが必要な場合は、お知らせください。

于 2012-05-02T16:48:25.843 に答える