web-dev-qa-db-ja.com

MySQL「On句の不明な列」

次のMySQLクエリがあります。

SELECT posts.id,  posts.name,  LEFT(posts.content, 400),  posts.author,  posts.date, users.display_name,
  GROUP_CONCAT(tags.tag ORDER BY tag_linking.pid ASC SEPARATOR ",") update_tags
FROM posts, tag_linking, tags
INNER JOIN `users`
ON posts.author=users.id;
WHERE tag_linking.pid = posts.id 
  AND tags.id = tag_linking.tid 
ORDER BY posts.date DESC

ご覧のとおり、3つのテーブルなどを接続します。とにかく、問題はエラーが発生することです。

ERROR CODE:
SQL Error (1054): Unknown column 'posts.author' in 'on clause'

別のページで使用されるこの単純なクエリは機能しますが、次のようになります。

SELECT posts.id,  posts.name,  LEFT(posts.content, 400),  posts.author,  posts.date, users.display_name FROM `posts`
INNER JOIN `users`
ON posts.author=users.id

なぜこれが起こっているのかについて誰かが考えていますか?ご協力いただきありがとうございます。

14
Connor Peet

ミックス結合構文のため

From Mysql[ドキュメント]

ただし、コンマ演算子の優先順位は、INNER JOIN、CROSS JOIN、LEFTJOINなどよりも低くなります。 結合条件があるときに他の結合タイプとコンマ結合を混在させると、 'on句'の不明な列 'col_name'の形式のエラーが発生する可能性があります。この問題への対処に関する情報は、このセクションの後半に記載されています。

解決策は次のとおりです。

結合を処理できるようにするには、最初の2つのテーブルを括弧で明示的にグループ化して、ON句のオペランドが(t1、t2)およびt3になるようにします。

SELECT * FROM(t1、t2)JOIN t3 ON(t1.i1 = t3.i3);

または、コンマ演算子の使用を避け、代わりにJOINを使用します。

SELECT * FROM t1 JOIN t2 JOIN t3 ON(t1.i1 = t3.i3);

42
Haim Evgi

あなたが持っているのはセミコロンですかON posts.author=users.id;

1
Adam Sweeney

from句でテーブルにエイリアスを指定し、それらを括弧で囲むと、機能します。ただし、結合の混合は依然として悪い習慣です。

0
Subodh

投稿テーブルに作者が存在しないというだけです。スペルミス?

0
Falcon