112

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

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

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

4

9 に答える 9

124

サブクエリは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
于 2012-12-26T22:10:24.627 に答える
12

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

SELECT (p.column1, p.column2, p.column3) FROM table1 p WHERE p.column1 = 1;

そして、次のようにする必要があります:

SELECT p.column1, p.column2, p.column3 FROM table1 p WHERE p.column1 = 1;

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

于 2020-09-07T15:15:25.523 に答える
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)
...
于 2012-12-26T22:10:21.900 に答える
1

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を入れ忘れたときにこの問題が発生しましたif!

于 2019-08-21T13:04:37.300 に答える