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 列”

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

是否有一个简单的解决方法,或者另一种方法来编写我的查询?

4

9 回答 9

124

您的子查询正在选择两列,而您正在使用它来投影一列(作为外部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
于 2012-12-26T22:10:24.627 回答
19

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

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma
于 2016-04-01T06:29:29.597 回答
12

如果您不小心在子句中使用=了代替,也会出现此错误:INWHERE

例如:

WHERE product_id = (1,2,3);
于 2017-05-26T09:43:09.817 回答
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)

好吧,你不能像这样从一个子查询中获得多个列。幸运的是,第二列已经出现了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 回答
2

在 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
于 2020-10-15T13:28:03.763 回答
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 回答
0

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

SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)
于 2018-09-12T19:50:01.547 回答
0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

在这里您使用子查询,但此子查询必须只返回一列。分开它,否则会显示错误。

于 2019-12-08T05:53:09.397 回答