2012-02-20 8 views
5

Dokumenty MySQL mówią: "Nie można odwołać się do tabeli TYMCZASOWEJ więcej niż raz w tym samym zapytaniu."Jak mogę odnieść się do tabeli TYMCZASOWEJ więcej niż raz w tym samym zapytaniu?

Wiem, że zostało to wcześniej zadane. Ale nie mogę znaleźć konkretnego rozwiązania dla następujących elementów.

robię preselekcji do tabeli tymczasowej

CREATE TEMPORARY TABLE preselection AS SELECT ...; 

teraz chcę zrobić kilka (około 20 lub nawet 30) związki

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

mogłem zrobić 20 lub 30 kopii preselekcji i czy każdy wybierz na każdej tabeli, ale jeśli rozumiem to dobrze, to jest to samo, co wywołanie kwerendy preselekcyjnej powyżej w każdym SELECT wewnątrz łańcucha UNION jako podzapytanie.

Czy istnieje sposób obejścia tego problemu?

Pozdrowienia,

chris

Pełna zapytania:

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

możliwy duplikat [Uzyskiwanie dostępu do tabeli tymczasowej wiele razy w MySql] (http://stackoverflow.com/questions/4078873/accessing-a -temporary-table-multiple-times-in-mysql) –

+1

Czy możesz pokazać pełne, prawdziwe zapytanie? Może nam to pomóc w znalezieniu rozwiązania, które nie wymaga wielokrotnego dodawania tabeli tymczasowej. – JohnFx

+0

Może to dobry pomysł. Oto moje pełne zapytanie, naprawdę nie mam pojęcia, jak to zrobić w inny sposób. (DODANO DO POSTA) –

Odpowiedz

4

Myślę, że komunikat jest jasny: nie można tego zrobić za pomocą jednego tabeli tymczasowej. Czy tworzenie widoku danych, zamiast tabel tymczasowych, pozwala na łatwe?

Views in mysql

+0

Robię to "sztuczka" przez cały czas dla wielu różnych problemów. To dobry nawyk, do którego można się przyzwyczaić. – northpole

+0

@Mosty, Problem z poglądami polega na tym, że są one globalne. Wydaje się, że nie istnieje sposób na utworzenie "tymczasowych widoków" sesji lokalnych. Spowoduje to problemy, gdy pojawi się wiele równoczesnych zapytań. – Pacerier

1

Tak to może być frustrujące. Rozwiązania, których zazwyczaj używam, obejmują unikanie tabeli tymczasowej z bardziej złożonymi zapytaniami lub używanie bardziej tymczasowych tabel.

prosta kopia (ale jak wspomniałeś to ma zastosowanie do ciebie)

CREATE TEMPORARY TABLE preselectionCopy AS 
SELECT * FROM preselection; 

Albo tabeli tymczasowej do przechowywania wyników

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

... co może być tak proste, jak

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`; 
Powiązane problemy