当前位置: 首页 > 面试题库 >

ON子句中的MySQL未知列

沙柏
2023-03-14
问题内容

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

有关:

  • 为什么没有比ANSI-89更好地采用SQL ANSI-92标准?


 类似资料:
  • 问题内容: 我有一个名为表有三列:,,。 我正在尝试创建一个查询,该查询将根据昵称返回余额,并且在使用此查询时遇到错误: 有人可以在这里看到我做错了吗? 问题答案: 反引号(`)用于标识符,例如表名,列名等。单引号(’)用于字符串文字。 您想做: 或者,更明确地说: 如果没有歧义的可能性,并且表/列名称没有特殊字符或空格,则可以将`设置为off。 这是一些干燥且难以阅读的文档:http : //d

  • 问题内容: 这个问题已经在这里有了答案 : ON子句中的MySQL未知列 (3个答案) 5年前关闭。 我有以下MySQL查询: 您可以看到,它连接了三个表等。总之,问题在于它给出了一个错误: 即使在另一个页面上使用此更简单的查询也可以: 有谁想到为什么会这样?谢谢你的帮助。 问题答案: 因为您的混合连接语法 [docs] 但是,逗号运算符的优先级小于INNER JOIN,CROSS JOIN,LE

  • 问题内容: 我需要在sakila数据库中找到电影的最长租借期。我有这个尝试: 但我得到了错误: 有人知道为什么吗?我使用了应该是汇总数据的列..我缺少什么 问题答案: 如文档中所写 SQL标准要求HAVING必须仅引用GROUP BY子句中的列或聚合函数中使用的列。但是,MySQL支持对此行为的扩展,并允许HAVING引用SELECT列表中的列以及外部子查询中的列。 您必须在select子句中指定

  • 错误:java.SQL.sqlsyntaxerrorexception:您的SQL语法中有一个错误;请查看与您的MariaDB服务器版本相对应的手册,以便在第1行'by name'附近使用正确的语法

  • 我试图在WHERE子句中将一个列从外部查询传递给内部查询,如下所示,MySQL不喜欢这样做。我不确定如何重写这个查询使其工作。 我很想知道如何让这个工作或重写它,使它将工作。我使用的是MySQL5.6,所以我没有可用的窗口函数,否则我认为可以工作。