2012-02-20 19 views
5

i documenti MySQL dicono: "Non è possibile fare riferimento a una tabella TEMPORARY più di una volta nella stessa query."Come posso fare riferimento a una tabella TEMPORARY più di una volta nella stessa query?

So che è stato chiesto prima. Ma non riesco a trovare una soluzione specifica per quanto segue.

sto facendo una preselezione in una tabella temporanea

CREATE TEMPORARY TABLE preselection AS SELECT ...; 

Ora voglio fare un po '(circa il 20 o anche 30) unioni

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

ho potuto fare 20 o 30 copie di preselezione ed esegui ogni selezione su ogni tabella ma, se capisco bene, è come richiamare la query di preselezione di cui sopra in ogni SELECT all'interno della catena UNION sotto forma di sottoquery.

C'è un modo per ovviare a questo problema?

Saluti,

chris

query full:

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

possibile duplicato di [Accesso a una tabella temporanea più volte in MySql] (http://stackoverflow.com/questions/4078873/accessing-a -temporary-table-multiple-times-in-mysql) –

+1

Puoi mostrare la query completa e reale? Potrebbe aiutarci a trovare idee per una soluzione alternativa che non richiede l'aggiunta della tabella temporanea più volte. – JohnFx

+0

Forse è una buona idea. Ecco la mia domanda completa, non ho davvero idea di come farlo in un modo diverso. (AGGIUNTO AL POSTO) –

risposta

4

Penso che il messaggio di errore è chiaro: non si può fare che con una singola tabella temporanea. La creazione di una vista dei dati, invece di una tabella temporanea, fa il trucco?

Views in mysql

+0

Faccio questo "trucco" tutto il tempo per molti problemi diversi. È una buona abitudine abituarsi. – northpole

+0

@Mosty, il problema con le viste è che sono globali. Non sembra esserci alcun modo per creare "viste temporanee" di sessione locale. Ciò causerà problemi quando ci sono più query simultanee. – Pacerier

1

Sì, può essere frustrante. Le soluzioni che uso abitualmente implicano l'evitamento della tabella temporanea con una query più complessa o l'utilizzo di più tabelle temporanee.

Un semplice copia (ma come lei ha citato questo è alcuna utilità per voi)

CREATE TEMPORARY TABLE preselectionCopy AS 
SELECT * FROM preselection; 

o una tabella temporanea per contenere i risultati

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

... che può essere semplice come

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`; 
Problemi correlati