sql >> Databáze >  >> RDS >> Mysql

Neznámý sloupec MySQL v klauzuli ON

Nemíchejte spojení stylu ANSI-89 a stylu ANSI-92. Mají odlišnou prioritu, což může vést k matoucím chybám, a to se zde stalo. Váš dotaz je interpretován následovně:

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

Ve výše uvedeném jsou spojení pomocí klíčového slova JOIN vyhodnocena jako první, než se vůbec uvažuje o spojení ve stylu čárky. V tomto bodě tabulka p ještě není deklarováno.

Z MySQL manuál :

Priorita operátoru čárka je však menší než u INNER JOIN, CROSS JOIN, LEFT JOIN a tak dále. Pokud zamícháte spojení čárkou s jinými typy spojení, když existuje podmínka spojení, dojde k chybě ve tvaru Neznámý sloupec 'col_name' v ​​'on clause' může nastat. Informace o řešení tohoto problému jsou uvedeny dále v této části.

Doporučuji vždy pomocí spojení ve stylu ANSI-92, tj. pomocí klíčového slova 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

Související:



  1. Ekvivalent LOAD DATA INFILE v Oracle

  2. Vkládání nových sloupců doprostřed tabulky?

  3. JSON_CONTAINS_PATH() Příklady v MySQL

  4. Jak vytvářet a mazat databáze a tabulky v MySQL