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

当我使用PDO时,“:cat”受我的PHP代码约束。2是“:cat”的有效值。

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

让我感到困扰的是,我认为该查询不会有问题。选择列,然后从另一个表中选择另外两个,然后从那里继续。我只是不知道是什么问题。

有没有简单的解决方法,或者是写查询的另一种方法?

Answers:


103

您的子查询正在选择两列,而您正在使用它来投影一列(作为外部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

感谢您的回复。我将修复查询,并将您标记为答案,但仅作为输入,您认为写查询的方式比现在使用的方式更好(但也忽略了其中的错误)吗?

啊。感谢您对原始帖子的修改。当StackOverflow允许我时,我一定会标记您为答案。非常感谢!

好吧,这使COUNT()事情变得有些混乱了。由于聚合,我给出的查询可能会给出错误。您可能需要将该聚合移动到子查询中,具体取决于查询的目标(目前尚不明确)。
cdhowie 2012年

17

如果您不小心使用逗号而不是AND在a的ON子句中,也会发生此错误JOIN

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

9

如果不小心在子句中使用=而不是,也会发生此错误:INWHERE

例如:

WHERE product_id = (1,2,3);

1
还是像LIKE而不是IN,就像我一样,无法找到为什么发生此错误。ty为指针。
Edgars Aivars '18

如果您在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)

好吧,您不能像这样从一个子查询中获取多个列。幸运的是,第二列已经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

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

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放在if函数中时遇到了这个问题!


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

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


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.