sql >> Database >  >> RDS >> Mysql

MySQL onbekende kolom in ON-clausule

Combineer geen ANSI-89 stijl en ANSI-92 stijl joins. Ze hebben verschillende voorrang, wat kan leiden tot verwarrende fouten, en dat is wat hier is gebeurd. Uw vraag wordt als volgt geïnterpreteerd:

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

In het bovenstaande worden de joins met het trefwoord JOIN eerst geëvalueerd voordat de join in kommastijl zelfs maar wordt overwogen. Op dat moment is de tabel p is nog niet gedeclareerd.

Van de MySQL handleiding :

De prioriteit van de komma-operator is echter lager dan die van INNER JOIN, CROSS JOIN, LEFT JOIN, enzovoort. Als u komma-joins combineert met de andere join-typen wanneer er een join-voorwaarde is, een fout in de vorm Onbekende kolom 'col_name' in 'on-clausule' kan gebeuren. Informatie over het omgaan met dit probleem vindt u verderop in dit gedeelte.

Ik raad altijd aan met behulp van joins in ANSI-92-stijl, d.w.z. met behulp van het JOIN-sleutelwoord:

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

Gerelateerd:



  1. Hoge beschikbaarheid beheren in PostgreSQL – Deel III:Patroni

  2. Een database-e-mailprofiel (SSMS) verwijderen

  3. Aangezien SQL Server geen pakketten heeft, wat doen programmeurs om dit te omzeilen?

  4. De Percona Audit Log-plug-in gebruiken voor databasebeveiliging