Không kết hợp kiểu ANSI-89 và kiểu ANSI-92. Chúng có mức độ ưu tiên khác nhau có thể dẫn đến các lỗi khó hiểu và đó là những gì đã xảy ra ở đây. Truy vấn của bạn đang được diễn giải như sau:
FROM property p, (
propertygeometry pg
JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
...
)
Ở trên, các phép nối sử dụng từ khóa JOIN sẽ được đánh giá đầu tiên trước khi phép nối kiểu dấu phẩy thậm chí còn được xem xét. Tại thời điểm đó, bảng p
chưa được khai báo.
Tuy nhiên, mức độ ưu tiên của toán tử dấu phẩy ít hơn so với INNER JOIN, CROSS JOIN, LEFT JOIN, v.v. Nếu bạn kết hợp phép nối dấu phẩy với các loại phép nối khác khi có điều kiện nối, thì sẽ xảy ra lỗi ở dạng Cột không xác định 'col_name' trong 'trên mệnh đề' có thể xảy ra. Thông tin về cách xử lý vấn đề này được đưa ra sau trong phần này.
Tôi khuyên bạn nên luôn luôn sử dụng phép nối kiểu ANSI-92, tức là sử dụng từ khóa 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
Có liên quan: