Я делаю некоторую работу над базой данных 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`
Если вы уверены, что имена столбцов правильны, проблема может быть от порядка объединений. Похоже, что соединения каждой стороны запятой строятся отдельно. (Я не уверен, что это возможно или даже возможно, но это единственное предположение, что я основываюсь на информации, которую вы даете)
Запрос можно изменить следующим образом:
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`
который все равно лучше читает.
Я бы предположил, что 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