【问题标题】:Unknown column {0} in on clauseon 子句中的未知列 {0}
【发布时间】:2009-11-18 05:30:13
【问题描述】:

我正在对 MySQL 数据库做一些工作,并完全被接收到错误所困扰

1054 - Unknown column 'Puzzles.PuzzleID' in 'on clause'

表名和列名都存在且正确。我刚刚在 Navicat 的视觉设计器中创建了它。

SELECT
`PuzzleCategories`.`PuzzleCategory`,
`Clients`.`BusinessName`,
`Puzzles`.`PuzzleNumber`
FROM
`Puzzles`
Inner Join `PuzzleCategories` ON `Puzzles`.`PuzzleCategoryID` = `PuzzleCategories`.`PuzzleCategoryID` ,
`Clients`
Inner Join `Publications` ON `Clients`.`ClientID` = `Publications`.`ClientID`
Inner Join `PublicationIssues` ON `PublicationIssues`.`PublicationID` =     `Publications`.`PublicationID`
Inner Join `PuzzleUsages` ON `PuzzleUsages`.`PuzzleID` = `Puzzles`.`PuzzleID` AND `PuzzleUsages`.`PublicationIssueID` = `PublicationIssues`.`PublicationIssueID`

【问题讨论】:

  • 您能否添加一些有关连接表的表结构/定义的详细信息?
  • 当您开始仅使用表“拼图”构建查询,然后一个接一个地添加其他表时会发生什么?这行得通吗?

标签: mysql sql mysql-error-1054


【解决方案1】:

我猜Puzzles 没有PuzzleID 列。该表中的列是否仅称为ID?还是Puzzle_ID

您应该运行SHOW CREATE TABLE Puzzles 来查看该表的当前定义。

有时缺少报价可能是罪魁祸首:

... ON `Puzzles.PuzzleID` ...

上面将查找一个字面名称为“Puzzles.PuzzleID”的列,即一个长度为 16 个字符且中间有一个点的列名。


@Bell 值得奖励,因为他注意到您混合了逗号样式连接和 SQL-92 样式连接。我没注意到!

您不应该在同一个查询中同时使用两者,因为连接操作的优先级可能会导致混淆。

JOIN 关键字具有更高的优先级。简化您的查询,以便我们查看表表达式,它的评估如下:

SELECT . . . 
FROM (Puzzles JOIN PuzzleCategories),
(Clients JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages)

问题是PuzzleUsages 的连接需要与Puzzles.PuzzleID 列进行比较,但由于优先级问题,它不能。该列不是最后一个JOIN 的操作数的一部分。

您可以使用括号来解决错误,显式覆盖表表达式的优先级(就像在算术表达式中使用括号一样):

SELECT . . . 
FROM Puzzles JOIN (PuzzleCategories, Clients)
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages

或者您可以始终使用 SQL-92 JOIN 语法。我同意@Bell 的观点,这更清楚。

SELECT . . . 
FROM Puzzles JOIN PuzzleCategories JOIN Clients
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages

【讨论】:

  • 给你的连接加上括号是一个健全的检查,mysql 不是给你一个更好的错误信息来显示解析失败的地方吗?
  • 感谢比尔的解释。直到昨天我才听说过逗号样式和 SQL-92 样式的连接。
【解决方案2】:

如果您确定列名正确,则问题可能出在连接的顺序上。听起来逗号两边的连接是单独构建的。 (我不确定这是否可能甚至可能,但这是我根据您提供的信息得出的唯一猜测)

查询可以重组为:

SELECT `PuzzleCategories`.`PuzzleCategory`, `Clients`.`BusinessName`, `Puzzles`.`PuzzleNumber` FROM `Clients` INNER JOIN `Publications` ON `Clients`.`ClientID` = `Publications`.`ClientID` INNER JOIN `PublicationIssues` ON `PublicationIssues`.`PublicationID` = `Publications`.`PublicationID` INNER JOIN `PuzzleUsages` ON`PuzzleUsages`.`PublicationIssueID` = `PublicationIssues`.`PublicationIssueID` INNER JOIN `Puzzles` ON `Puzzles`.`PuzzleID` = `PuzzleUsages`.`PuzzleID` INNER JOIN `PuzzleCategories` ON `Puzzles`.`PuzzleCategoryID` = `PuzzleCategories`.`PuzzleCategoryID`

反正读起来更好。

【讨论】:

  • 天哪,贝尔,准点。看起来 Navicat 的查询生成器已经……过时了。很好的收获,谢谢。
猜你喜欢
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 2013-01-26
  • 2020-04-25
相关资源
最近更新 更多