web-dev-qa-db-ja.com

MySQL-オペランドには1列を含める必要があります

作成中のシステムで作業しているときに、プロジェクトで次のクエリを使用しようとしました。

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つを選択して、そこから続行します。何が問題なのかわかりません。

これに対する簡単な修正、またはクエリを記述する別の方法はありますか?

72
user1543386

サブクエリは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
78
cdhowie

このエラーは、ANDON句で誤ってJOINの代わりにコンマを使用した場合にも発生する可能性があります。

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma
11
silkfire
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)
...
5
Ry-

このエラーは、IN句でWHEREの代わりに誤って=を使用した場合にも発生する可能性があります。

例えば:

WHERE product_id = (1,2,3);
4
jay padaliya

このエラーが発生する可能性がある別の場所は、文字列の外側にコンマを持つ値を割り当てることです。例えば:

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)
0
iAndy