2010-11-01 34 views
47

Tôi có truy vấn MySQL sau:MySQL cột không rõ tại khoản ON

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, propertygeometry pg 
    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 
    AND p.PropertyGeometryID = pg.id 
GROUP BY p.id 

Và tôi nhận được lỗi này:

# 1054 - cột Unknown 'p.id' trong 'về khoản '

Theo như tôi có thể thấy truy vấn có vẻ đúng, bất kỳ ý tưởng nào có thể sai?

+0

Tôi chắc chắn bạn đã kiểm tra, nhưng bạn có một cột 'id' trên bảng' thuộc tính' được đặt tên là p? –

Trả lời

84

Không kết hợp kiểu ANSI-89 và kiểu kết nối ANSI-92. Họ có quyền ư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 hiểu như sau:

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

Ở trên, các tham gia sử dụng từ khóa JOIN được đánh giá đầu tiên trước khi tham gia kiểu dấu phẩy thậm chí được xem xét. Tại thời điểm đó, bảng p chưa được khai báo.

Từ MySQL manual:

However, the precedence of the comma operator is less than of INNER JOIN, CROSS JOIN, LEFT JOIN, and so on. If you mix comma joins with the other join types when there is a join condition, an error of the form Unknown column 'col_name' in 'on clause' may occur. Information about dealing with this problem is given later in this section.

tôi khuyên bạn nên luôn sử dụng ANSI-92 phong cách tham gia, tức là sử dụng JOIN từ khóa:

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 

liên quan:

+0

Không có thuật ngữ như "ngầm" hoặc "rõ ràng" liên quan đến cú pháp JOIN. –

+5

Câu trả lời hay. Điều này khắc phục vấn đề ngay lập tức cộng với đã cho tôi thêm thông tin sẽ giúp tôi thời gian tới. Cảm ơn Mark. –

0

Tôi gặp phải lỗi này cột không xác định, khác biệt là truy vấn được xây dựng thông qua HQL bên trong session.executeQuery ("chọn id, tên, tổng (thanh toán), custType từ nhóm cust bởi thương hiệu") đó là lý do tại sao phải bằng tay gõ bên trong tham gia hoặc tham gia từ khóa không phải là một tùy chọn như là hql là một trong những tạo ra nó. nó tạo ra một sumthing truy vấn như thế này:

select cust_id, name, sum(paid), c.custTypeId 
from customer c, custType ct 
on c.custTypeId = ct.custTypeId 

nó nói "c.custTypeId không rõ" cột khi tôi 101% chắc chắn nó mang cột đó.

lớp của tôi/quan hệ:

Customer { 
Integer custId 
CustomerType custType 
} 

CustomerType{ 
Integer custTypeId 
string code 
} 

vấn đề nằm ở dấu phẩy trong "từ khách hàng, custType" dòng. nó phải bằng từ JOIN như câu trả lời đã nói ở trên. nhưng vì nó là HQL và đang được tạo ra, tôi không thể làm điều đó. Những gì tôi đã làm được sửa đổi bằng truy vấn và thay vì gõ custType chọn, tôi đã nhập select custType.id, custType.code

Tôi biết nó cơ bản nhưng đối với những giờ đầu tiên như tôi, đó là một cuộc đấu tranh.

7

Như đã nêu trước đây có vấn đề ưu tiên sử dụng kết nối thông qua toán tử dấu phẩy, trong đó LEFT JOIN sẽ được thực thi và do đó tham chiếu đến bí danh bảng sẽ không tồn tại tại thời điểm đó. Mặc dù bạn mặc nhiên có thể nói với MySQL sử dụng lệnh JOIN qua tuyên bố rằng bạn cũng có thể nói với MySQL để đánh giá dấu phẩy gia nhập bảng đầu tiên, sau đó thực hiện trái tham gia thusly:

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, propertygeometry pg) 
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 
AND p.PropertyGeometryID = pg.id 
GROUP BY p.id 

Thông báo các bảng dấu phẩy tách ra được chứa trong ngoặc đơn() . Các bí danh và cột của bảng giờ đây sẽ có sẵn cho các JOIN khác của bạn.

Các vấn đề liên quan