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

“ : cat”由我的 PHP 代码绑定,因为我正在使用 PDO。2是“ : cat”的有效值。

这个查询给了我一个错误: “ # 1241-Operand 应该包含1列(s)”

让我感到困惑的是,我认为这个查询不会有问题。选择列,然后从另一个表中再选择两个列,然后继续。我只是不知道问题出在哪里。

有没有简单的修复方法,或者其他方法来编写我的查询?

417577 次浏览
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)
...

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

如果在 JOINON子句中意外地使用逗号而不是 AND,也可能发生此错误:

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

This error can also occur if you accidentally use = instead of IN in the WHERE clause:

例如:

WHERE product_id = (1,2,3);

此错误可能发生的另一个地方是指定一个在字符串外面有逗号的值。例如:

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

如果不小心错过了 if函数名,也可能发生此错误。

for example:

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函数中的时候,出现了这个问题!

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

Here you using sub-query but this sub-query must return only one column. 分开它,否则它会显示错误。

在我的例子中,问题在于我错误地将我的专栏选择用括号括起来:

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;

听起来很傻,但是它导致了这个错误,我们花了一些时间才弄明白。

我在 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

我在建立公司数据库方面也有同样的问题。 这是密码

SELECT FNAME,DNO FROM EMP
WHERE SALARY IN (SELECT MAX(SALARY), DNO
FROM EMP GROUP BY DNO);