MySQLはJOINエラーを残しました
-
28-09-2019 - |
質問
以前は古いMySQLバージョンで動作していたSQLがいくつかありますが、新しいMySQL 5バージョンにアップグレードした後、エラーが発生しました。これがSQLです:
SELECT portfolio.*, projects.*, types.*
FROM projects, types
LEFT JOIN portfolio
ON portfolio.pfProjectID = projects.projectID
WHERE projects.projectType = types.typeID AND types.typeID = #URL.a#
ORDER BY types.typeSort, projects.projectPriority ASC
そして、私が受け取っている新しいエラー:
Unknown column 'projects.projectID' in 'on clause'
これを新しいMySQLバージョンの互換性のあるSQLに変換するにはどうすればよいですか?
どうもありがとう!
解決
コンマオペレーターの代わりに内側の結合を使用してクエリを書き換える必要があります。
SELECT portfolio.*, projects.*, types.*
FROM projects
INNER JOIN types
ON projects.projectType = types.typeID
LEFT JOIN portfolio
ON portfolio.pfProjectID = projects.projectID
WHERE types.typeID = #URL.a#
ORDER BY types.typeSort, projects.projectPriority ASC
説明:
これは、ANSI標準に準拠するために、MySQLの変化するオペレーターの優先順位に関係しています。 MySQLドキュメントをご覧ください。 http://dev.mysql.com/doc/refman/5.1/en/join.html
内側の結合と(コンマ)は、結合条件がない場合に意味的に同等です。どちらも指定されたテーブル間でデカルト製品を生成します(つまり、最初のテーブルのすべての行が2番目のテーブルのすべての行に結合されます)。
ただし、コンマオペレーターの優先順位は、内側の結合、クロス参加、左結合などよりも少ないです。結合条件があるときに他の結合タイプと接合するコンマを混合すると、「句の「col_name」という形式の誤差が発生する可能性があります。この問題への対処に関する情報は、このセクションの後半で説明します。
MySQLページには、より詳細な説明もあります。「以前は、コンマオペレーター(、)」を検索します。
他のヒント
クエリを書いた方法で、コンパイラはあなたが参加したいと思っています portfolio
に types
, 、だからそれはあなたの不平を言います on
節は参照します projects
テーブル。
このANSIスタイルのバージョンをお試しください:
SELECT *
FROM projects p
inner join types t on p.projectType = t.typeID AND t.typeID = #URL.a#
LEFT JOIN portfolio pf ON pf.pfProjectID = p.projectID
ORDER BY t.typeSort, p.projectPriority
ProjectIDコラムが実際に存在し、タイプミスがない場合は、これを変更してみてください
SELECT portfolio.*, projects.*, types.*
FROM projects
INNER JOIN types ON projects.projectType = types.typeID
LEFT JOIN portfolio
ON portfolio.pfProjectID = projects.projectID
WHERE types.typeID = #URL.a#
ORDER BY types.typeSort, projects.projectPriority ASC