0

我正在做一些关于 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`
4

2 回答 2

2

我猜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列进行比较,但由于优先级问题,它不能。该列不是 last 的操作数的一部分JOIN

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

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

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

SELECT . . . 
FROM Puzzles JOIN PuzzleCategories JOIN Clients
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages
于 2009-11-18T05:34:57.260 回答
1

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

查询可以重组为:


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`

无论如何,它读起来更好。

于 2009-11-18T05:56:51.020 回答