Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Coluna desconhecida do MySQL na cláusula ON


Não misture o estilo ANSI-89 e o estilo ANSI-92. Eles têm precedências diferentes que podem levar a erros confusos, e foi isso que aconteceu aqui. Sua consulta está sendo interpretada da seguinte forma:
FROM property p, (
    propertygeometry pg
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    ...
)

No exemplo acima, as junções usando a palavra-chave JOIN são avaliadas primeiro antes que a junção de estilo vírgula seja considerada. Nesse ponto, a tabela p ainda não está declarado.

Do MySQL manual :

No entanto, a precedência do operador de vírgula é menor do que INNER JOIN, CROSS JOIN, LEFT JOIN e assim por diante. Se você misturar junções por vírgula com outros tipos de junção quando houver uma condição de junção, um erro no formato Coluna desconhecida 'nome_coluna' na cláusula 'on' pode ocorrer. Informações sobre como lidar com esse problema são fornecidas posteriormente nesta seção.

Eu recomendo sempre usando junções de estilo ANSI-92, ou seja, usando a palavra-chave JOIN:
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

Relacionado: