2012-04-08 4 views
0

다른 테이블을 조인하는 쿼리를 작성하려고하지만이 경우 하위 쿼리의 왼쪽 테이블에있는 열 중 하나의 값을 사용해야합니다. 그렇게하면 mySQL이 이러한 이름의 열을 찾을 수 없다는 오류가 표시됩니다.왼쪽 테이블의 값을 사용하여 두 테이블 조인

먼저, 여기에 2 개 테이블 (T1과 T2)를 참조 내 쿼리입니다 (@category 내 프로그램에서 자막 처리 된 매개 변수) : 지금

SELECT t1.incID, t1.name, t1.sortBy, SQ.person, SQ.pointsValue 
FROM table1 t1 
LEFT OUTER JOIN (
    SELECT incID, person, IF(t1.sortBy=0, max(points), min(points)) pointsValue 
    FROM table2 
    GROUP BY incID 
) SQ ON SQ.incID = t1.incID 
WHERE [email protected] 
ORDER BY t1.name ASC 
LIMIT 0 , 30 

여기이 쿼리를 실행할 때 # 1054 - 'field list'의 't1.sortBy'알 수 없음 열

t1.sortBy = 0을 0 = 0으로 바꾸면 쿼리가 제대로 실행되므로 방금 그 것처럼 보입니다. mySQL이 작업 순서를 어떻게 수행하는지에 대해 혼란스러워하고있는 것 같습니다.

누군가이 질문에 대한 작업 순서를 mySQL에서 어떻게 처리하는지, 그리고이 문제를 해결할 수있는 방법을 분명히 할 수 있습니까?

+0

오류는 'table1'에'sortby' 컬럼이 없다고 말합니다. –

+0

@ user1110302 문제는 괄호 안에 있습니다.이 부분을 바깥 쪽 쿼리로 이동하지 않는 이유는 무엇입니까? IF (t1.sortBy = 0, max (points), min (points)) pointsValue – McGarnagle

답변

1

파생 테이블에서 외부 테이블을 참조 할 수 없습니다. IF 로직을 바깥쪽으로 옮겨야합니다 :

SELECT t1.incID, t1.name, t1.sortBy, SQ.person, 
     IF(t1.sortBy=0, maxPoints, minPoints) pointsValue 
FROM table1 t1 
LEFT OUTER JOIN (
    SELECT incID, person, max(points) maxPoints, min(points) minPoints 
    FROM table2 
    GROUP BY incID 
) SQ ON SQ.incID = t1.incID 
WHERE [email protected] 
ORDER BY t1.name ASC 
LIMIT 0 , 30 
+0

이 시점에서, 첫 번째 쿼리의 t1.sortBy 값 대신에 두 번째 쿼리를 사용하는 것이 더 효율적입니까? MySQL은 두 테이블을 끌어와 논리를합니까? – user1110302

+0

DB 엔진에 의한 최적화에 따라 다릅니다. 나는 30 레코드 제한이 주어진다면, IF에서 중첩 된 최대 및 최소 하위 쿼리는 더 빨라지 겠지만 나는 전에 잘못 알고 있었다 :-) 그렇다면 다시 (incID, person)에 대한 인덱스가 있으면 빠른 것이되어야한다고 생각한다. 충분히. –

+0

달콤한! 도움을 주셔서 감사합니다, 정말 고마워요! :) – user1110302