Mysql
 sql >> Base de données >  >> RDS >> Mysql

Colonne MySQL inconnue dans la clause ON

Ne mélangez pas les jointures de style ANSI-89 et ANSI-92. Ils ont une priorité différente qui peut conduire à des erreurs confuses, et c'est ce qui s'est passé ici. Votre requête est interprétée comme suit :

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

Dans ce qui précède, les jointures utilisant le mot-clé JOIN sont évaluées en premier avant que la jointure de type virgule ne soit même prise en compte. À ce stade, la table p n'est pas encore déclaré.

À partir de MySQL manuel :

Cependant, la priorité de l'opérateur virgule est inférieure à INNER JOIN, CROSS JOIN, LEFT JOIN, etc. Si vous mélangez des jointures par virgule avec les autres types de jointure lorsqu'il existe une condition de jointure, une erreur de la forme Colonne inconnue 'col_name' dans 'on clause' peut se produire. Des informations sur la résolution de ce problème sont données plus loin dans cette section.

Je recommanderais toujours en utilisant des jointures de style ANSI-92, c'est-à-dire en utilisant le mot-clé 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

Connexe :