2010-11-19 8 views
2

私は、次のような情報を提示するテーブルの数から可用性のグリッドを作成しようとしています。各会場についてはphp/mysql - unionクエリでデータグリッドを作成していますか?

------------------------------------------------------ 
venue  | 22/11 | 23/11 | 24/11 | 25/11 | 26/11 | 
------------------------------------------------------ 
Some venue | £24 | £25 | £32 | N/A | £65 | 
------------------------------------------------------ 
Some venue | £20 | N/A | £22 | £34 | £43 | 
------------------------------------------------------- 

を私のようなクエリを使用して、選択した日付の期間のためのレコードセットを作成することができます

ここで重要なことは、私のレコードセットを正しい日数(つまり、稼働している週の5つのエントリ)に保ちながら使用できない日付に対してはnull値を返すことができるということです。

そうのようなものに、私は、データセットを結合するUNIONクエリを使用して簡単に検討していたこのリストに他の会場のそれぞれを追加するには:

(SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId = 7 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate) 
UNION 
(SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId = 8 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate); 

10の異なる会場が言うとこれで私の懸念はあるという可能性クエリーを実行するにはかなり長い時間がかかる可能性があります。

私の質問は次のとおりです:UNIONクエリは私の唯一のオプションですか、クエリされているすべての会場で一週間の結果が得られるようにするために使用できる代替JOINがありますか?

がうまくいけば、これは明確である:-S

EDIT:

alt text

:下記必要なレコードのスクリーンショットと現在のクエリがされた後

は、私は何を示すために、 alt text

IN()を示唆するもの: alt text

答えて

2
SELECT td.query_date, a.venueId 
FROM temp_date td 
CROSS JOIN 
     (
     SELECT 7 AS id 
     UNION ALL 
     SELECT 8 AS id 
     ) ids 
LEFT JOIN 
     availability a 
ON  a.date = td.query_date 
     AND a.id = ids.id 
ORDER BY 
     ids.id, td.query_date 

またGROUP BYがここに重複を処理するための正しい方法ではありませんのでご注意:実際には、あなたのクエリがMySQL以外の任意の他のシステムに泣き叫ぶ、さらに有効ANSIGROUP BY行動とMySQLしてしまいます。

(date, id)の重複はavailabilityで可能ですか?はいの場合、これらの重複のどれを選択する必要がありますか?

+0

これはありがとう、私はすぐに演劇を持っています。そして、日付、重複は利用可能ではありません。 – simnom

+0

@simnom:あなたは 'GROUP BY'を取り除くことができます、それは冗長です。 – Quassnoi

+0

それは素晴らしい仕事です。ありがとうございました。 – simnom

1

なぜIN()を使用しないのですか?

SELECT temp_date.queryDate, availability.venueId 
FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId IN(7, 8) 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate 
+0

こんにちは、IN()を使用して私は5行を返すだけですが、各会場では10行1つの「週」が必要です。 – simnom

+0

元の質問を修正して、私の意味をより詳しく示しました。 – simnom

0

はい、間違いなく、WebnetはあなたのvenueIDを選択するためにIN文を使用することができます。

SELECT temp_date.queryDate, availability.venueId 

FROM temp_date 
LEFT JOIN availability 
ON temp_date.queryDate = availability.date 
AND availability.venueId IN(7, 8) 
GROUP BY temp_date.queryDate 
ORDER BY temp_date.queryDate 
+0

@ webnetの答えに対するコメントとして、これはtemp_dateの各エントリに対して1つのエントリだけでは望みの結果が得られません。私が必要とするのは、各会場/日付の組み合わせの会場/日付エントリです。 1つの会場につき5つのエントリー、週に2つの会場に10のエントリーを有する。 – simnom

+0

元の質問を修正して、私の意味をより詳しく示しました。 – simnom

関連する問題