我有以下 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 等。如果在存在连接条件时将逗号连接与其他连接类型混合使用,则会出现以下形式的错误 “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

有关的:

其他提示

如所陈述之前有使用优先问题通过逗号运算符,其中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

通知的逗号分隔的包含括号内表()。该表的别名和列现在将提供给您的其他连接。

我碰上这个错误未知列中,DIFF是查询建立直通HQL内部session.executeQuery(“选择ID,名称,总和(付费),从由品牌CUST组custType”),这就是为什么具有手动类型内加入或加入关键字是不是一种选择为HQL是一个产生它。 它产生一个查询sumthing这样的:

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

它,当我101%肯定它负有证明一栏写着“未知c.custTypeId”列。

我的类/关系:

Customer {
Integer custId
CustomerType custType
}

CustomerType{
 Integer custTypeId
string code
}

问题在于在“从客户,custType”行的逗号。它应该是与这个词加入成为上述问题的答案。但由于它是HQL,正在生成,我不能这样做。我所做的是通过查询,而不是键入修改选择custType,我输入select custType.id, custType.code

我知道这是基本的,但对于初来乍像我一样,这是一个斗争。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top