MySQL-オペランドには1つの列が含まれている必要があります


92

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

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

「:cat」は、PDOを使用しているため、PHPコードにバインドされています。2は「:cat」の有効な値です。

ただし、そのクエリではエラーが発生します:「#1241-オペランドには1つの列が含まれている必要があります」

私を困惑させているのは、このクエリは問題なく機能すると思うということです。列を選択し、別のテーブルからさらに2つを選択して、そこから続行します。何が問題なのかわからない。

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

回答:


103

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

返信ありがとうございます。クエリを修正し、回答としてマークしますが、入力のためだけに、現在使用しているものよりもクエリを作成する「より良い」方法があると思いますか(ただし、エラーも無視します)。

ああ。元の投稿を編集していただきありがとうございます。StackOverflowで許可されたら、必ずあなたを回答としてマークします。どうもありがとう!

まあ、それCOUNT()は物事を少し捨てています。私が与えたクエリは、おそらく集計のためにエラーを出します。クエリの目的によっては、その集計をサブクエリに移動する必要がある場合があります(現時点では明確ではありません)。
cdhowie 2012

17

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

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma

9

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

例えば:

WHERE product_id = (1,2,3);

1
または、私が行ったようにINの代わりにLIKEを実行すると、このエラーが発生する理由を見つけることができませんでした。ポインタのty。
Edgars Aivars 2018年

SELECT句のフィールドを角かっこで囲む場合にも発生する可能性があります。たとえば、SELECT(Field1、Field2)FROM Table
Paul Chris Jones

6
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)
...

1

私の場合、問題は、列の選択を誤って括弧で囲んだことでした。

SELECT (p.column1, p.colum2, p.column3) FROM table1 p where id = 1;

そして、する必要があります:

SELECT p.column1, p.colum2, p.column3 FROM table1 p where id = 1;

ばかげているように聞こえますが、それがこのエラーの原因であり、それを理解するのに少し時間がかかりました。


これが私の問題だったとは信じられません。ブラケットは合法だと思いました
Josh McGee

0

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

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

0

このエラーは、誤ってif関数名を見逃した場合にも発生する可能性があります。

例えば:

set v_filter_value = 100;

select
    f_id,
    f_sale_value
from
    t_seller
where
    f_id = 5
    and (v_filter_value <> 0, f_sale_value = v_filter_value, true);

私が入れミスしたとき、この問題を得た場合if機能!


0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

ここではサブクエリを使用していますが、このサブクエリは1つの列のみを返す必要があります。分離しないとエラーが表示されます。


0

IntellijコンソールでMySQLスクリプトを実行しているときに、間違った場所に角かっこを追加したため、このエラーが発生しました。

違う:

SELECT user.id
FROM user
WHERE id IN (:ids); # Do not put brackets around list argument

正しい:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct

:これは、ここで最初の答えと一致しないstackoverflow.com/questions/24551177/...
rubydio

@rubydio、その質問はHQLとHibernateを参照していますが、私の答えはIntellijコンソールのMySQLを参照しています
Janac Meena
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.