SQL-89の「コンマスタイル」の結合構文とSQL-92のJOIN
を混在させないでください。 構文。これら2種類の結合操作の優先順位には微妙な問題があります。
あなたの場合、結果は、結合条件LEFT JOIN
を評価しているということです。 u
の前 テーブルエイリアスが存在します。そのため、u.usr_auto_key
が何であるかがわかりません。 です。
この問題は、JOIN
を使用して修正できます。 すべての結合の構文:
SELECT
`u`.`usr_auto_key` AS `u__usr_auto_key`,
`s`.`set_auto_key` AS `s__set_auto_key`,
`u2`.`usr_auto_key` AS `u2__usr_auto_key`,
`u2`.`set_auto_key` AS `u2__set_auto_key`,
`u2`.`value` AS `u2__value`
FROM `User` `u` JOIN `Setting` `s`
LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key`
WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)
u
の間に結合条件が表示されませんでした およびs
クエリで、これをデカルト積にするつもりだと思いますか?
joinの2つの構文形式間の相互作用の詳細については、MySQL5.0.12でのJoinProcessingの変更のセクションを参照してください。 ページ上の
コメントを再確認してください:私が言ったように、それは演算子の優先順位と関係があります。 FROM A, B JOIN C
を使用したSQLクエリがある場合 次に、B JOIN C
を評価します。 A
に注意を払う前に --これにはテーブルエイリアスの割り当てが含まれます。したがって、B JOIN C
の参加条件が A
のテーブルエイリアスを使用します そのエイリアスがまだ存在しないため、エラーが発生します。
それを逆にしてB, A JOIN C
を実行すると 次に、A JOIN C
の結合条件を評価します。 A
のエイリアス が利用可能であり、機能します(この場合は少なくとも)。
ただし、これは脆弱なソリューションです。A
を並べ替えただけでは修正できないクエリも必要になる場合があるためです。 およびB
。カンマを使用した古い結合構文の使用を停止することをお勧めします。そうすれば、どの結合式もすべてのテーブルエイリアスにアクセスできるため、どのクエリでもこの問題が発生することはありません。