sql-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'

据我所知,查询看起来是正确的,知道发生什么了吗?

Matthew James Taylor asked 2019-11-16T01:32:43Z
3个解决方案
98 votes

不要混合使用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等。 如果在存在联接条件时将逗号联接与其他联接类型混合使用,则可能会出现“ 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

有关:

  • 为什么没有比ANSI-89更好地采用SQL ANSI-92标准?
Mark Byers answered 2019-11-16T01:33:41Z
10 votes

如前所述,在通过逗号运算符使用联接时会出现优先级问题,在该情况下将执行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

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

Tom Mulkins answered 2019-11-16T01:34:12Z
1 votes

我碰到了这个错误未知列,比较起来是查询是通过session.executeQuery(“按品牌分组从客户组中选择ID,名称,总和(付费),客户类型”)中的HQL构建的,这就是为什么必须手动键入内部联接或 join关键字不是一个选项,因为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
}

问题在于“来自客户,custType”行中的逗号。 答案应该是JOIN字样。 但是由于它是HQL并且正在生成,所以我不能这样做。 通过查询修改了我所做的事情,而不是键入select custType,而是键入select custType.id, custType.code

我知道这很基本,但是对于像我这样的初学者来说,这是一个挣扎。

user742102 answered 2019-11-16T01:35:05Z
translate from https://stackoverflow.com:/questions/4065985/mysql-unknown-column-in-on-clause