我在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`
答案 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`
无论如何都读得更好。