Предполагам, че 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