on子句中的未知列{0}

时间:2009-11-18 05:30:13

标签: mysql sql mysql-error-1054

我在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`

2 个答案:

答案 0 :(得分: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列进行比较,但由于优先级问题,它不能。该列不是最后一个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

答案 1 :(得分: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`

无论如何都读得更好。