2012-02-20 64 views
5

MySQL文檔說:「您不能在同一查詢中多次引用TEMPORARY表。」如何在同一查詢中多次引用TEMPORARY表?

我知道這已被問過。但我無法找到以下的具體解決方案。

我做了預選到一個臨時表

CREATE TEMPORARY TABLE preselection AS SELECT ...; 

現在我想要做一些(約20或甚至30)工會

(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) – 2012-02-20 16:33:33

+1

你可以顯示完整的真實查詢嗎?它可以幫助我們提出一種解決方案,不需要多次添加臨時表。 – JohnFx 2012-02-20 16:42:34

+0

也許這是個好主意。在這裏,我的完整查詢,我真的不知道如何以不同的方式做到這一點。 (添加到帖子) – 2012-02-23 15:32:55

回答

4

我認爲錯誤信息是明確的:你不能這樣做,有一個臨時表。創建數據視圖而不是臨時表是否有用?

Views in mysql

+0

我一直在爲這個「詭計」處理很多不同的問題。習慣於習慣是一種好習慣。 – northpole 2012-02-20 16:35:24

+0

@Mosty,問題與意見是他們是全球性的。似乎沒有辦法創建會話本地「臨時視圖」。這會在有多個同時查詢時導致問題。 – Pacerier 2015-05-04 08:14:16

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`; 
相關問題