2012-02-20 20 views
5

los documentos de MySQL dicen: "No se puede hacer referencia a una tabla TEMPORAL más de una vez en la misma consulta".¿Cómo puedo hacer referencia a una tabla TEMPORAL más de una vez en la misma consulta?

Sé que esto se ha pedido antes. Pero no puedo encontrar una solución específica para lo siguiente.

estoy haciendo una preselección en una tabla temporal

CREATE TEMPORARY TABLE preselection AS SELECT ...; 

ahora quiero hacer algo (en torno a 20 o incluso 30) uniones

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

que podría hacer 20 o 30 copias de preselección y seleccione cada una en cada tabla, pero si lo entiendo bien, esto es lo mismo que invocar la consulta de preselección de arriba en cada SELECCIÓN dentro de la cadena de la UNIÓN como una subconsulta.

¿Hay alguna forma de evitar este problema?

Saludos,

chris

consulta completa:

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

posible duplicado de [Acceso a una tabla temporal varias veces en MySql] (http://stackoverflow.com/questions/4078873/accessing-a -temporary-table-multiple-times-in-mysql) –

+1

¿Puedes mostrar la consulta completa y real? Podría ayudarnos a encontrar ideas para una solución alternativa que no requiera agregar la tabla temporal varias veces. – JohnFx

+0

Quizás es una buena idea. Aquí está mi consulta completa, realmente no tengo ni idea de cómo hacerlo de una manera diferente. (AGREGADO AL PUESTO) –

Respuesta

4

creo que el mensaje de error es clara: no se puede hacer eso con una sola tabla temporal. ¿La creación de una vista de los datos, en lugar de tablas temporales, funciona?

Views in mysql

+0

Hago este "truco" todo el tiempo para muchos problemas diferentes. Es un buen hábito para acostumbrarse. – northpole

+0

@Mosty, el problema con las vistas es que son globales. No parece haber ninguna forma de crear "vistas temporales" locales de sesión. Esto causará problemas cuando haya múltiples consultas simultáneas. – Pacerier

1

Sí, puede ser frustrante. Las soluciones que uso habitualmente implican evitar la tabla temporal con una consulta más compleja o el uso de más tablas temporales.

Una copia simple (pero como usted ha mencionado esto es ninguna utilidad para usted)

CREATE TEMPORARY TABLE preselectionCopy AS 
SELECT * FROM preselection; 

o una tabla temporal para mantener sus resultados

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

... que puede ser tan simple como

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`; 
Cuestiones relacionadas