MySQL - 操作数应包含1列

时间:2012-12-26 22:08:15

标签: mysql sql mysql-error-1241

在我正在创建的系统上工作时,我试图在我的项目中使用以下查询:

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”由我的PHP代码绑定,因为我正在使用PDO。 2是“:cat”的有效值。

该查询虽然给我一个错误:“#1241 - 操作数应包含1列”

让我感到困惑的是,我认为这个查询不会有任何问题。选择列,然后从另一个表中再选择两个,然后从那里继续。我只是无法弄清楚问题是什么。

是否有一个简单的解决方法或其他方式来编写我的查询?

9 个答案:

答案 0 :(得分:77)

您的子查询正在选择两列,而您正在使用它来投影一列(作为外部SELECT子句的一部分)。在此上下文中,您只能从此类查询中选择一列。

考虑加入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

答案 1 :(得分:11)

如果您在AND的{​​{1}}子句中意外使用逗号而不是ON,也会发生此错误:

JOIN

答案 2 :(得分:5)

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)

好吧,你不能从一个子查询中获得多个列。幸运的是,第二列已经是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)
...

答案 3 :(得分:3)

如果您在=子句中意外使用IN而不是WHERE,也会发生此错误:

例如:

WHERE product_id = (1,2,3);

答案 4 :(得分: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;

听起来很愚蠢,但这是导致此错误的原因,需要花费一些时间才能解决。

答案 5 :(得分:0)

该错误可能发生的另一个地方是分配一个在字符串之外具有逗号的值。例如:

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

答案 6 :(得分: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 放在if函数中的问题!

答案 7 :(得分:0)

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

在这里使用子查询,但是此子查询必须仅返回一列。 将其分开,否则将显示错误。

答案 8 :(得分: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