我有以下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”
据我所知,查询看起来是正确的,有什么想法可能是错误的?
5条答案
按热度按时间xlpyo6sf1#
不要混淆ANSI-89风格和ANSI-92风格的连接。它们具有不同的优先级,这可能会导致令人困惑的错误,这就是这里发生的事情。您的查询将被解释如下:
字符串
在上面的例子中,使用JOIN关键字的连接是在考虑逗号风格的连接之前首先计算的,此时表
p
还没有声明。从MySQL manual:
但是,逗号运算符的优先级低于INNER JOIN、CROSS JOIN、LEFT JOIN等。如果在存在连接条件时将逗号连接与其他连接类型混合使用,则可能会出现形式为**Unknown column 'col_name' in 'on clause'**的错误。本节后面将提供有关处理此问题的信息。
我推荐 always 使用ANSI-92风格的连接,即使用JOIN关键字:
型
相关:
vx6bjr1n2#
如前所述,通过逗号操作符使用连接存在优先级问题,其中LEFT JOIN将被执行,因此对表别名的引用将不存在。虽然您可以通过该语句隐式地告诉MySQL使用JOIN,但您也可以告诉MySQL首先评估逗号连接的表,然后执行左连接:
字符串
请注意,逗号分隔的表包含在括号()中。表别名和列现在将可用于其他JOIN。
q3aa05253#
executeQuery(“select id,name,sum(paid),custType from cust group by brand”)这就是为什么必须手动输入inner join或join关键字不是一个选项,因为hql是生成它的一个。
字符串
它显示“unknown c.custTypeId”列,而我101%确定它具有该列。
我的班级/关系:
型
问题出在“from customer,custType”行中的逗号上。它应该与JOIN一词一起作为上述答案。但由于它是HQL并且正在生成,我不能这样做。我所做的是通过查询修改,而不是键入select custType,我键入
select custType.id, custType.code
我知道这是基本的,但对于像我这样的第一次,这是一个斗争。
kxe2p93d4#
以防有人像这样搬起石头砸自己的脚。
我是MySQL的新手,正在测试一个新的模式,但是我没有想到在推送到服务器进行测试时选择添加DROP命令。
这意味着,当我调整表和更新视图时,我不断得到这些奇怪的错误。
长话短说,在早期测试阶段,确保你在每次推送时都在服务器上更新表模式,否则你的新视图可能会因为服务器上的旧表而失败。
falq053o5#
如果这对某人有帮助(以及对未来的我自己的说明),我在MariaDB中尝试执行以下查询时遇到了这个错误:
字符串
而我应该写的是
型
我将把它留给读者来发现差异作为练习。