Неизвестный столбец {0} в предложении

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`
  • 2
    Не могли бы вы добавить некоторые подробности о структурах таблиц / определениях объединенных таблиц?
  • 0
    что произойдет, когда вы начнете строить запрос только с таблицей Puzzles, а затем добавите дополнительные таблицы одну за другой? Это работает?
Теги:
mysql-error-1054

2 ответа

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`

который все равно лучше читает.

  • 0
    Омг Белл, на месте. Казалось бы, построитель запросов Navicat ... устарел. Отличный улов, спасибо.
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
  • 0
    Заключение в скобки ваших объединений является чем-то вроде проверки работоспособности, и разве mysql не дает вам лучшего сообщения об ошибке, показывающего, где прервался анализ?
  • 0
    Спасибо за объяснение, Билл. До вчерашнего дня я никогда не слышал о соединениях в стиле запятой и в стиле SQL-92.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню