1

クライアントのために、旅行代理店のウェブサイトを構築しました。今、彼らは私にいくつかの最適化と自動化を依頼しました。これらのことの 1 つは、検索リストに表示される宿泊施設が予約可能でなければならないということです。

簡略化すると、これが構造です

宿泊施設オブジェクトがあり、宿泊施設には 1 つ以上の PricePeriods があります。

私がしなければならないことは、特定の宿泊施設に関連する最後の価格期間を選択することです。priceperiod には、タイムスタンプである「date_until」フィールドがあります。クエリでは、チェックを行う必要があります。現在のタイムスタンプは、価格期間の最後のタイムスタンプよりも小さい必要があります。

これは、指定された宿泊施設に接続されたすべての priceperiod-rows から priceperiod テーブルから最後のタイムスタンプを取得する 2 番目のクエリで簡単に実行できます。

これが最善のケースなのか、それともサブクエリを使用する必要があるのか​​ 疑問に思っています。もしそうなら、このようなクエリはどのように見えるでしょうか? サブクエリの経験はあまりありません。

アップデート

テーブル構造(シンプル)

宿泊施設 ->ID

PricePeriod -> ID | 宿泊ID | 日付まで

簡略化:

SELECT fieldlist FROM Accommodation WHERE ID = $id
SELECT MAX(DateUntil) FROM PricePeriod WHERE AccommodationID = $id

しかし、私はこれを1つのクエリでやりたいと思っています。私はそれがこのように明確であることを願っています..

4

1 に答える 1

2

それは多くのことに依存しますが、あなたがすべきことは、いくつかの異なる選択肢を試すことです.

個人的には、次のようにします。

SELECT fieldlist, 
(SELECT MAX(DateUntil) FROM PricePeriod) WHERE AccomidationID = a.id) AS last_date
FROM Accommodation AS a
WHERE a.id = $id

あなたもすることができます(しかし、それはそれほど効率的ではないかもしれません)...:

SELECT fieldlist, MAX(b.DateUntil)
FROM Accommodation AS a
JOIN PricePeriod AS b ON a.id = b.AccommodationID
WHERE a.id = $id
GROUP BY a.id

重要なことは、それらすべてを試すことです (SQL_NO_CACHE結果が毎回真になるように必ず使用してください)。それらを実行してEXPLAIN、それらがどれほど「重い」かを確認してください...

于 2010-08-19T11:12:23.773 に答える