2013-08-21 6 views
5

私は2つのテーブル、レストラン、受注テーブルを持っていますrestaurant_idstatusdateフィールドは、毎日注文テーブルの別の行です。右の状態から少なくとも1つの行と結合しました

私は、レストランをフィルタリングし、いくつかの日付範囲の少なくとも1つの予約を持っているレストランを表示する必要がありますが、カレンダーに表示する必要があります、それは情報のレストランのリストのように見えるはずです。

なめらかだから、この

enter image description here

のように、それはat least one day with reserved status条件はその日付の範囲で満たされている場合は、そのレストランのためにその日付範囲のすべての注文が同様にフェッチされなければならないことを意味しています。

それは、日付の怒りであるかのため、この場合には、例えば、私は、restaurant2のため、8月31日の注文情報を持っていない、ので、私は、いつもの内部結合

SELECT r.`id`, r.`name`, o.`date`, o.`status` 
FROM restaurants r 
INNER JOIN orders o ON r.id = o.restaurant_id AND o.date BETWEEN '2013-08-10' AND '2013-08-31' 
AND status = 'reserved' 

をすることはできません10から31までですが、そのステータスは '閉じています'。 だから、私は左を作るために考えていますが、この

SELECT r.`id`, r.`name`, o.`date`, o.`status`, o.`id` order_id 
FROM restaurants r 
LEFT JOIN orders o ON r.id = o.restaurant_id AND 
o.date BETWEEN '2013-08-10' AND '2013-08-31' 
WHERE o.`id` IS NOT NULL 

のように参加しかし、私はまた、オーダーのステータス=「予約」は、少なくとも一つの行があることを確認するために、1つの条件を追加する必要があり、私はどこに追加してみましたCOUNT(o.status = 1) > 0のような節ですが、エラーが発生します。

おかげ

+1

そして、Yの状態が予約されている少なくとも1つのレコードでrestauantsを取得するには、サブクエリを使用してください。 o内部結合を使用できます。 –

+0

@ダンブラックあなたはそれについて少し拡大できますか?おかげで – dav

答えて

3

私は(「N/A」のようなものを想定したと「予約」これを達成するための最良の方法だと思いますが受注テーブルに格納されている最初のインスタンス内のすべての注文に参加した後、使用することです二その期間内にご予約を持っている唯一のレストランにそれを制限するために参加する:

SELECT r.`id`, r.`name`, o.`date`, o.`status`, o.`id` order_id 
FROM restaurants r 
     INNER JOIN orders o 
      ON r.id = o.restaurant_id 
      AND o.date BETWEEN '2013-08-10' AND '2013-08-31' 
     INNER JOIN 
     ( SELECT DISTINCT o2.Restaurant_ID 
      FROM orders o2 
      WHERE o2.date BETWEEN '2013-08-10' AND '2013-08-31' 
      AND  o2.Status = 'Reserved' 
     ) o2 
      ON r.id = o2.restaurant_id; 

Example on SQL Fiddle

+0

あなたは私にどのくらい感謝しているのか分かりません:)。どうもありがとう。私は数十万のレストランを持っていれば、これは非常に高価でしょうか?それを最適化するためにはどのような指標が必要でしょうか? – dav

+0

はい、これはおそらく最もスケーラブルなソリューションです。私はテーブル上で他にどのようなクエリを使用するのかはわかりませんが、このために 'restaurant_id'、' status'、 'date'の' orders'に3つのインデックスがあります。 2つのインデックスしか持たず、そのうちの1つは2つの列にあり、データの分布を知らずに正確に言うのは難しいです。例えばそれぞれの「注文」が1日にレストランごとに一意の場合、これらの2つの列にユニークなインデックスを追加し、ステータスには単一のノンクラスタードインデックスを追加します。 – GarethD

+0

本当にありがとうございました。私はもう一つ質問したかった。私は同じクエリを使用しようとしましたが、左の結合(anti-join)を使用して無料のrestaruantsを取得しようとしましたが、私はそれを理解できませんでした。そのためのhttp://stackoverflow.com/questions/18362311/left-join-with-empty-rows-from-right-table-mysql。ありがとう – dav

関連する問題