ON子句中的MySQL未知列

我有以下的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子句'中的未知列'p.id'

据我所见,查询看起来是正确的,任何想法可能是错的?

不要混合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等。 如果在存在连接条件时将逗号连接与其他连接types混合,则可能会发生“on子句”中的未知列“col_name”forms的错误。 有关处理这个问题的信息在本节后面给出。

我build议总是使用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 

有关:

  • 为什么SQL ANSI-92标准没有被ANSI-89更好地采用呢?

如前所述,通过逗号运算符使用连接将会执行LEFT JOIN,因此在此时将不存在对表别名的引用。 虽然你可以隐式地告诉MySQL通过这个语句来使用JOIN,但你也可以告诉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 

请注意逗号分隔的表格包含在括号()中。 表别名和列现在将可用于其他联接。

我碰到这个错误未知的列,差异是通过HQL内部session.executeQuery(“selectID,名称,总和(支付),从cust集团品牌custTypebuild立查询”)这就是为什么必须手动键入内部连接或join关键字不是一个选项,因为hql是生成它的一个。 它会产生一个像这样的查询:

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

它说“未知的c.custTypeId”列,当我101%确定它承载该列。

我的class级/关系:

 Customer { Integer custId CustomerType custType } CustomerType{ Integer custTypeId string code } 

问题在于“从客户,custType”系列的逗号。 应该用JOIN这个词作为上面的答案。 但由于它是HQL和正在生成,我不能这样做。 我所做的是通过查询修改而不是键入select custType,我键入select custType.id, custType.code

我知道这是基本的,但像我这样的第一次,这是一个斗争。