2012-02-20 14 views
5

MySQLのドキュメントでは、「同じクエリで複数回TEMPORARYテーブルを参照することはできません。同じクエリで何度もTEMPORARYテーブルを参照できますか?

これは以前に尋ねられました。しかし、私は以下の特定の解決策を見つけることができません。

私は今、私はいくつかの(20あるいは30の周りを)やるたい一時テーブルに

CREATE TEMPORARY TABLE preselection AS SELECT ...; 

を事前選択をやっている労働組合

(SELECT FROM preselection ...) 
UNION 
(SELECT FROM preselection ...) 
UNION 
...... 
UNION 
(SELECT FROM preselection ...) 

私は事前選択の20のまたは30のコピーを作ることができます各テーブルでそれぞれを選択しますが、これを正しく理解すれば、UNIONチェーン内のすべてのSELECTでサブクエリとして上記の事前選択クエリを呼び出すのと同じことになります。

この問題を回避する方法はありますか?

挨拶、

クリス

全クエリ:

CREATE TEMPORARY TABLE preselection AS 
(
SELECT id, title, chapter, date2, date, snid, max(score) FROM `movies` 

WHERE 
(
cluster is not NULL 
) 
AND 
(
`date` <= '2012-02-20 05:20:00' 
AND `date` > '2012-02-19 17:20:00' 
AND (TIMEDIFF(date, date2) < '12:00:00') 
) 
GROUP BY cluster 
) 
UNION 
(
SELECT id, title, chapter, date2, date, snid, score FROM `movies` 
WHERE cluster IS NULL 
AND 
(
`date` <= '2012-02-20 05:20:00' AND `date` > '2012-02-19 17:20:00' AND (TIMEDIFF(date, date2) < '12:00:00') 
) 
); 

(SELECT * FROM preselection WHERE snid=1 AND chapter LIKE '#A_OT%' 
DESC LIMIT 4) 
UNION 
… 
UNION 
(SELECT * FROM preselection WHERE snid=19 AND chapter LIKE '#A_OT%' 
LIMIT 4) 
UNION 
... for each chapter from A to J and every snid from 1 to 19 ... 
UNION 
(SELECT * FROM preselection WHERE snid=1 AND chapter LIKE '#J_OT%' 
LIMIT 4) 
UNION 
… 
UNION 
(SELECT * FROM preselection WHERE snid=19 AND chapter LIKE '#J_OT%' 
LIMIT 4) 

ORDER BY `score` DESC, `date`; 
+0

[[MySqlで一時テーブルに複数回アクセスする]]の可能な複製(http://stackoverflow.com/questions/4078873/accessing-a -temporary-table-multiple-times-in-mysql) –

+1

本当の完全なクエリを表示できますか?これは、一時テーブルを複数回追加する必要がない回避策のアイデアを思いつくのに役立ちます。 – JohnFx

+0

多分それは良い考えです。ここで私の完全な質問、私は本当に別の方法でそれを行う方法がありません。 (POSTに追加) –

答えて

4

私は、エラーメッセージがクリアされていると思う:あなたは、単一の一時テーブルでそれを行うことはできません。テンポラリテーブルではなく、データのビューを作成するのがトリックですか?

Views in mysql

+0

私はこの「トリック」を常にさまざまな問題に対応しています。それに慣れるのは良い習慣です。 – northpole

+0

@Mosty、ビューの問題はそれらがグローバルであることです。セッションローカルの "一時的なビュー"を作成する方法はありません。複数の同時クエリーがある場合、これは問題を引き起こします。 – Pacerier

1

はい、それはイライラすることができます。私が通常使用するソリューションは、より複雑なクエリを使用して一時テーブルを回避するか、より多くの一時テーブルを使用することです。以下のような単純なことができ

単純なコピー(ただし、これはあなたに何も使用されていない言及したように)

CREATE TEMPORARY TABLE preselectionCopy AS 
SELECT * FROM preselection; 

またはあなたの結果

CREATE TEMPORARY TABLE result (
    id INT NULL, 
    title VARCHAR(256) NULL 
    ... 
    ); 

を保持するための一時的なテーブル...

CREATE TEMPORARY TABLE result AS 
SELECT * FROM preselection WHERE snid=1 AND chapter LIKE '#A_OT%' 
LIMIT 4; 

INSERT INTO result 
SELECT * FROM preselection WHERE snid=19 AND chapter LIKE '#A_OT%' 
LIMIT 4; 

... 

SELECT * FROM result 
ORDER BY `score` DESC, `date`; 
関連する問題