Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Unbekannte Spalte {0} in on-Klausel

Ich tippe auf Puzzles hat keine Spalte PuzzleID . Heißt die Spalte einfach ID in dieser Tabelle? Oder Puzzle_ID ?

Sie sollten SHOW CREATE TABLE Puzzles ausführen um die aktuelle Definition dieser Tabelle anzuzeigen.

Manchmal kann ein fehlendes Zitat schuld sein:

... ON `Puzzles.PuzzleID` ...

Das Obige würde nach einer Spalte mit dem wörtlichen Namen "Puzzles.PuzzleID" suchen ,“ also ein 16 Zeichen langer Spaltenname mit einem Punkt in der Mitte.

@Bell verdient den Preis dafür, dass Sie bemerkt haben, dass Sie Joins im Komma-Stil und Joins im SQL-92-Stil mischen. Das ist mir nicht aufgefallen!

Sie sollten nicht beide in derselben Abfrage verwenden, da die Priorität von Join-Operationen wahrscheinlich für Verwirrung sorgt.

Der JOIN Schlüsselwort hat eine höhere Priorität. Um Ihre Abfrage zu vereinfachen, damit wir uns die Tabellenausdrücke ansehen können, würde sie wie folgt ausgewertet werden:

SELECT . . . 
FROM (Puzzles JOIN PuzzleCategories),
(Clients JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages)

Das Problem ist, dass der Join zu PuzzleUsages muss mit Puzzles.PuzzleID verglichen werden Spalte, aber aufgrund des Vorrangproblems kann es nicht. Die Spalte gehört nicht zu den Operanden des letzten JOIN .

Sie können Klammern verwenden, um den Fehler zu beheben, indem Sie die Priorität von Tabellenausdrücken explizit überschreiben (so wie Sie Klammern in arithmetischen Ausdrücken verwenden würden):

SELECT . . . 
FROM Puzzles JOIN (PuzzleCategories, Clients)
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages

Oder Sie können einfach SQL-92 JOIN verwenden Syntax konsistent. Ich stimme @Bell zu, dass dies klarer ist.

SELECT . . . 
FROM Puzzles JOIN PuzzleCategories JOIN Clients
JOIN Publications JOIN PublicationIssues JOIN PuzzleUsages