MySQL ON子句中的未知列

4si2a6ki  于 5个月前  发布在  Mysql
关注(0)|答案(5)|浏览(44)

我有以下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”

据我所知,查询看起来是正确的,有什么想法可能是错误的?

xlpyo6sf

xlpyo6sf1#

不要混淆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等。如果在存在连接条件时将逗号连接与其他连接类型混合使用,则可能会出现形式为**Unknown column 'col_name' in 'on clause'**的错误。本节后面将提供有关处理此问题的信息。
我推荐 always 使用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


相关:

vx6bjr1n

vx6bjr1n2#

如前所述,通过逗号操作符使用连接存在优先级问题,其中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。

q3aa0525

q3aa05253#

executeQuery(“select id,name,sum(paid),custType from cust group by brand”)这就是为什么必须手动输入inner join或join关键字不是一个选项,因为hql是生成它的一个。

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

字符串
它显示“unknown c.custTypeId”列,而我101%确定它具有该列。
我的班级/关系:

Customer {
Integer custId
CustomerType custType
}

CustomerType{
 Integer custTypeId
string code
}


问题出在“from customer,custType”行中的逗号上。它应该与JOIN一词一起作为上述答案。但由于它是HQL并且正在生成,我不能这样做。我所做的是通过查询修改,而不是键入select custType,我键入select custType.id, custType.code
我知道这是基本的,但对于像我这样的第一次,这是一个斗争。

kxe2p93d

kxe2p93d4#

以防有人像这样搬起石头砸自己的脚。
我是MySQL的新手,正在测试一个新的模式,但是我没有想到在推送到服务器进行测试时选择添加DROP命令。
这意味着,当我调整表和更新视图时,我不断得到这些奇怪的错误。
长话短说,在早期测试阶段,确保你在每次推送时都在服务器上更新表模式,否则你的新视图可能会因为服务器上的旧表而失败。

falq053o

falq053o5#

如果这对某人有帮助(以及对未来的我自己的说明),我在MariaDB中尝试执行以下查询时遇到了这个错误:

SELECT a.name, b.name
FROM `cities` as a
INNER JOIN `countries` as b 
ON `a.country_id` = `b`.`id`;

字符串
而我应该写的是

SELECT a.name, b.name
FROM `cities` as a
INNER JOIN `countries` as b 
ON `a`.`country_id` = `b`.`id`;


我将把它留给读者来发现差异作为练习。

相关问题