복붙노트

[SQL] ON 절에서 MySQL을 알 수없는 열

SQL

ON 절에서 MySQL을 알 수없는 열

나는 다음과 같은 MySQL의 쿼리를 가지고 :

SELECT p.*,
    IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
    pm.MediaID,
    date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
    astext(pg.Geometry) AS Geometry
FROM property p, propertygeometry pg
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
    LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
WHERE p.paused = 0
    AND p.PropertyGeometryID = pg.id
GROUP BY p.id

그리고이 오류를 받고 있어요 :

# 1054 - '절에'알 수없는 열 'p.id'

지금까지 내가 바로 어떤 생각을 쿼리 모습을 볼 수 무엇을 잘못 될 수 있을까?

해결법

  1. ==============================

    1.ANSI-89 스타일과 ANSI-92 스타일의 조인 혼합하지 마십시오. 그들은 혼란 오류가 발생할 수있는 다른 우선 순위를 가지고 있고, 그 여기에서 일어난 것입니다. 다음과 같이 귀하의 질의 해석되고있다 :

    ANSI-89 스타일과 ANSI-92 스타일의 조인 혼합하지 마십시오. 그들은 혼란 오류가 발생할 수있는 다른 우선 순위를 가지고 있고, 그 여기에서 일어난 것입니다. 다음과 같이 귀하의 질의 해석되고있다 :

    FROM property p, (
        propertygeometry pg
        JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
        ...
    )
    

    위의에서이 키워드 가입 쉼표 스타일도 고려 조인하기 전에 먼저 평가됩니다 사용하여 결합한다. 그 시점에서 테이블 p는 아직 선언되지 않았습니다.

    MySQL의 설명서에서 :

    나는 즉 키워드 조인을 사용, ANSI-92 스타일의 조인을 사용하여 항상 권하고 싶습니다 :

    SELECT p.*,
        IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
        pm.MediaID,
        date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
        astext(pg.Geometry) AS Geometry
    FROM property p
        JOIN propertygeometry pg ON p.PropertyGeometryID = pg.id
        JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
        LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
        LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
    WHERE p.paused = 0
    GROUP BY p.id
    

    관련 :

  2. ==============================

    2.이 전에 언급 한 바와 같이 사용하여 우선 순위 문제는 LEFT이 실행됩니다 가입 쉼표 연산자를 통해 조인 및 테이블 별칭에 대한 참조 때문에 그 시간에 존재하지 않습니다. 당신이 암시 적으로 그 문을 통해이 가입 사용하는 MySQL을 말할 수 있지만 당신은 또한 테이블이 먼저, 다음 왼쪽 thusly 히 결합 실행 합류 쉼표를 평가하기 위해 MySQL을 말할 수 있습니다 :

    이 전에 언급 한 바와 같이 사용하여 우선 순위 문제는 LEFT이 실행됩니다 가입 쉼표 연산자를 통해 조인 및 테이블 별칭에 대한 참조 때문에 그 시간에 존재하지 않습니다. 당신이 암시 적으로 그 문을 통해이 가입 사용하는 MySQL을 말할 수 있지만 당신은 또한 테이블이 먼저, 다음 왼쪽 thusly 히 결합 실행 합류 쉼표를 평가하기 위해 MySQL을 말할 수 있습니다 :

    SELECT p.*,
    IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
    pm.MediaID,
    date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
    astext(pg.Geometry) AS Geometry
    FROM (property p, propertygeometry pg)
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
    LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
    WHERE p.paused = 0
    AND p.PropertyGeometryID = pg.id
    GROUP BY p.id
    

    분리 된 테이블은 괄호 내에 포함 된 쉼표를 주목하라 (). 다른 조인에 테이블 별칭과 열은 이제 사용할 수 있습니다.

  3. ==============================

    3.나는 DIFF 쿼리가 session.executeQuery ( "SELECT ID, 이름, 합계 (지불) 브랜드로 CUST 그룹에서, custType")를 수동으로 내부 입력에 가입하거나에 가진 이유 내부 HQL을 통해 내장되어 있습니다이 오류 알 수없는 열로 충돌 HQL이 생성 한 그대로 키워드에 가입하는 것은 옵션이 아닙니다. 그것은 다음과 같이 sumthing 쿼리를 생성합니다

    나는 DIFF 쿼리가 session.executeQuery ( "SELECT ID, 이름, 합계 (지불) 브랜드로 CUST 그룹에서, custType")를 수동으로 내부 입력에 가입하거나에 가진 이유 내부 HQL을 통해 내장되어 있습니다이 오류 알 수없는 열로 충돌 HQL이 생성 한 그대로 키워드에 가입하는 것은 옵션이 아닙니다. 그것은 다음과 같이 sumthing 쿼리를 생성합니다

    select cust_id, name, sum(paid), c.custTypeId
    from customer c, custType ct
    on c.custTypeId  = ct.custTypeId 
    

    나는 101 % 확신은 해당 열을 부담입니다 때 "알 수없는 c.custTypeId"열을 말한다.

    내 클래스 / 관계 :

    Customer {
    Integer custId
    CustomerType custType
    }
    
    CustomerType{
     Integer custTypeId
    string code
    }
    

    "고객으로부터, custType"라인에서 쉼표에 문제가 자리 잡고 있습니다. 그것은 위에서 언급 한 대답으로 가입 단어로해야한다. 이 HQL과 생성되고 있기 때문에, 나는 그렇게 할 수 없습니다. 내가 custType를 선택 쿼리 대신 입력하는 수정 않았다, 나는 custType.id, custType.code를 선택 입력

    나는 그것이 기본 알고 있지만 나 같은 첫번째 타이머를 위해, 그것은 투쟁이었다.

  4. from https://stackoverflow.com/questions/4065985/mysql-unknown-column-in-on-clause by cc-by-sa and MIT license