ON子句中的MySQL未知列

时间:2010-11-01 00:48:11

标签: sql mysql mysql-error-1054

我有以下MySQL查询:

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

我收到了这个错误:

#1054 - 'on clause'中的未知列'p.id'

据我所知,查询看起来正确,任何想法可能出错?

3 个答案:

答案 0 :(得分:94)

不要混用ANSI-89样式和ANSI-92样式联接。它们具有不同的优先级,可能导致混淆错误,这就是这里发生的事情。您的查询解释如下:

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

在上面,在考虑逗号样式连接之前,首先评估使用JOIN关键字的连接。此时,表p尚未声明。

来自MySQL manual

  

但是,逗号运算符的优先级小于INNER JOIN,CROSS JOIN,LEFT JOIN等。如果在存在连接条件时将逗号连接与其他连接类型混合,则可能会出现“on子句”中未知列'col_name'形式的错误。有关处理此问题的信息将在本节后面给出。

我建议使用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

相关:

答案 1 :(得分:10)

如前所述,通过逗号运算符使用连接存在优先级问题,其中将执行LEFT JOIN,因此此时不存在对表别名的引用。虽然您可以通过该语句隐式告诉MySQL使用JOIN,但您也可以告诉MySQL首先评估逗号连接表,然后执行left 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, 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

请注意,逗号分隔的表包含在括号()中。表别名和列现在可供您的其他JOIN使用。

答案 2 :(得分:1)

我碰到了这个错误未知列,差异是查询是通过HQL里面的session.executeQuery构建的(“选择id,名称,总和(付费),来自cust group by custgroup的custType)”这就是为什么不得不手动输入内部连接或连接关键字不是一个选项,因为hql是生成它的人。 它产生一个这样的查询:

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

当我101%确定它有该列时,它会显示“unknown c.custTypeId”列。

我的课程/关系:

Customer {
Integer custId
CustomerType custType
}

CustomerType{
 Integer custTypeId
string code
}

问题出在“来自customer,custType”行的逗号中。应该用JOIN这个词作为上面的答案。但由于它是HQL并且正在生成,我不能这样做。我所做的是通过查询修改而不是键入select custType,我键入了select custType.id, custType.code

我知道这是基本的,但对于像我这样的初学者来说,这是一场斗争。