2012-02-20 5 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 result (
    id INT NULL, 
    title VARCHAR(256) NULL 
    ... 
    ); 

을 보유 할

CREATE TEMPORARY TABLE preselectionCopy AS 
SELECT * FROM preselection; 

또는 임시 테이블 ...

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`; 
관련 문제