作成中のシステムで作業しているときに、プロジェクトで次のクエリを使用しようとしました。
SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)
FROM topics
LEFT OUTER JOIN posts ON posts.topic_id = topics.id
WHERE topics.cat_id = :cat
GROUP BY topics.id
PDOを使用しているため、「:cat」はPHPコードにバインドされています。 2は ":cat"の有効な値です。
しかし、そのクエリは私にエラーを与えます:「#1241-オペランドは1列を含むべきです」
私が困っているのは、このクエリは問題なく機能すると思います。列を選択し、別のテーブルからさらに2つを選択して、そこから続行します。何が問題なのかわかりません。
これに対する簡単な修正、またはクエリを記述する別の方法はありますか?
サブクエリは2つの列を選択していますが、1つの列を投影するために使用しています(外側のSELECT
句の一部として)。このコンテキストでは、このようなクエリから1つの列のみを選択できます。
代わりにusers
テーブルに参加することを検討してください。これにより、users
から必要な列を選択する際の柔軟性が向上します。
SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
COUNT( posts.solved_post ) AS solved_post,
users.username AS posted_by,
users.id AS posted_by_id
FROM topics
LEFT OUTER JOIN posts ON posts.topic_id = topics.id
LEFT OUTER JOIN users ON users.id = posts.posted_by
WHERE topics.cat_id = :cat
GROUP BY topics.id
このエラーは、AND
のON
句で誤ってJOIN
の代わりにコンマを使用した場合にも発生する可能性があります。
JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
^
should be AND, not a comma
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)
そのような1つのサブクエリから複数の列を取得することはできません。幸いなことに、2番目の列は既にposts.posted_by
です!そう:
SELECT
topics.id,
topics.name,
topics.post_count,
topics.view_count,
posts.posted_by
COUNT( posts.solved_post ) AS solved_post,
(SELECT users.username AS posted_by_username
FROM users
WHERE users.id = posts.posted_by)
...
このエラーは、IN
句でWHERE
の代わりに誤って=
を使用した場合にも発生する可能性があります。
例えば:
WHERE product_id = (1,2,3);
このエラーが発生する可能性がある別の場所は、文字列の外側にコンマを持つ値を割り当てることです。例えば:
SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)