Не смесвайте съединения в стил ANSI-89 и ANSI-92. Те имат различно предимство, което може да доведе до объркващи грешки и това се случи тук. Вашето запитване се тълкува по следния начин:
FROM property p, (
propertygeometry pg
JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
...
)
В горното, съединенията, използващи ключовата дума JOIN, се оценяват първо, преди дори да се разгледа присъединяването в стил запетая. В този момент таблицата p
все още не е деклариран.
От MySQL ръководство :
Въпреки това, приоритетът на оператора запетая е по-малък от този на INNER JOIN, CROSS JOIN, LEFT JOIN и т.н. Ако смесите съединения със запетая с другите типове присъединяване, когато има условие за присъединяване, грешка от формата Неизвестна колона 'col_name' в 'on clause' може да възникне. Информация за справянето с този проблем е дадена по-късно в този раздел.
Бих препоръчал винаги използвайки присъединяване в стил ANSI-92, т.е. с помощта на ключовата дума 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
Свързано: