2012-04-15 5 views
1

유니언에서 하위 쿼리를 참조 할 수있는 방법이 있습니까?유니온에서 MYSQL, 하위 쿼리 참조

나는 다음과 같은 일을하려고하고, 임시 테이블을 피하기 위해 싶지만, 한 번만 작업을 수행하는 것이 의미가 있도록 하위 쿼리가 훨씬 더 큰 데이터 집합에서 그려집니다 ..

SELECT * FROM (SELECT * FROM ads WHERE state='FL' AND city='Maitland' AND page='home' ORDER BY RAND()) AS sq WHERE spot = 'full-banner' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'leaderboard' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'rectangle1' LIMIT 1 
UNION 
SELECT * FROM sq WHERE spot = 'rectangle2' LIMIT 1 
.... etc,, 

결과 집합의 단일 열에 대해 DISTINCT를 지정할 수 없다는 것은 유감입니다.

답변

1

파생 테이블 생성을 반복하지 않고 수행하려는 작업을 수행 할 방법이 없습니다.

ads를 조회하는 것은 당신이 좋아하는 색인을 추가하는 시도해야 다음 정말 비싼 경우

alter table ads add index (state, city, page, spot); 

쿼리가 너무 많이 소요되는 인덱스를 추가 한 후, 나는이 데이터를 저장하는 테이블을 생성 권하고 싶습니다 경우와 다음 각 지점에 해당 테이블을 쿼리하십시오.

데이터에 따라 GROUP BY과 (과) 비슷한 결과를 얻을 수 있습니다.

+0

tbl은 첫 번째 하위 쿼리에 대한 참조 일 뿐이므로 어쩌면 그 이름이 다소 혼란 스럽습니다. 광고 테이블은 크지 만 하위 쿼리 이후에는 약 90 개의 행만 남습니다. 혼동을 피하기 위해 별칭을 업데이트하겠습니다. – christian

+0

알았어요. 내 대답이 업데이트되었습니다. –

+1

내 초기 테스트 결과 다음과 같은 결과가 나타났습니다! ... * * (* 선택 광고 * 여기에서 상태 = 'FL'AND city = 'Maitland'ORDER BY RAND()) sq GRO BY BY .spot ... 그래서 GROUP BY는 하나의 결과 만 반환합니다. 나는 ORDER BY와 비슷하다고 생각했다. 감사 – christian