首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ON子句中的MySQL未知列

ON子句中的MySQL未知列
EN

Stack Overflow用户
提问于 2010-11-01 08:48:11
回答 3查看 94.3K关注 0票数 59

我有以下MySQL查询:

代码语言:javascript
复制
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‘

据我所知,查询看起来是正确的,你知道哪里可能是错误的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-01 08:53:27

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

代码语言:javascript
复制
FROM property p, (
    propertygeometry pg
    JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
    ...
)

在上面的代码中,使用JOIN关键字的连接在考虑逗号样式连接之前首先被评估。此时,表p还没有声明。

MySQL manual

但是,逗号运算符的优先级低于内部联接、交叉联接、左联接等。如果在存在联接条件时将逗号联接与其他联接类型混合使用,则可能会出现'on子句‘中的形式为Unknown列'col_name’的错误。有关处理此问题的信息将在本节的后面部分提供。

我建议始终使用ANSI-92样式的连接,即使用JOIN关键字:

代码语言:javascript
复制
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

相关信息:

票数 106
EN

Stack Overflow用户

发布于 2014-11-07 00:24:58

如前所述,通过逗号操作符使用连接存在优先级问题,此时将执行左连接,因此将不存在对表别名的引用。虽然您可以通过该语句隐式地告诉MySQL使用连接,但您也可以告诉MySQL首先计算逗号连接表,然后执行left JOIN:

代码语言:javascript
复制
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

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

票数 14
EN

Stack Overflow用户

发布于 2013-09-11 11:59:26

我碰到了这个错误的未知列,不同之处在于查询是通过session.executeQuery内部的hql构建的(“select id,name,sum(paid),custType from cust group by brand"),这就是为什么必须手动键入inner join或join关键字不是一个选项,因为生成它的是HQL。它会生成如下的查询求和:

代码语言:javascript
复制
select cust_id, name, sum(paid), c.custTypeId
from customer c, custType ct
on c.custTypeId  = ct.custTypeId 

当我101%确定它包含这一列时,它会显示“未知c.custTypeId”列。

我的类/关系:

代码语言:javascript
复制
Customer {
Integer custId
CustomerType custType
}

CustomerType{
 Integer custTypeId
string code
}

问题出在"from customer,custType“行中的逗号。它应该使用单词JOIN作为上面提到的答案。但是因为它是HQL并且正在生成,所以我不能这样做。我所做的是通过查询进行修改,我输入的不是select custType,而是select custType.id, custType.code

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4065985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档