在正在创建的系统上工作时,我试图在项目中使用以下查询:
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列
让我难过的是,我认为此查询没有问题。选择列,然后从另一个表中选择两个,然后从那里继续。我只是无法弄清楚问题是什么。
是否有一个简单的修复程序,或者另一种编写我的查询的方法?
您的子查询正在选择两个列,而您正在使用它来投影一列(作为外部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
在我的情况下,问题是我错误地将我的列选择误认为:
: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;
听起来很愚蠢,但是这引起了此错误,花了一些时间才能弄清楚。
如果您在JOIN
的ON
子句中意外使用逗号而不是AND
,也可能发生此错误:
JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
^
should be AND, not a comma
如果您在WHERE
子句中意外使用=
而不是IN
,也可能发生此错误:
例如:
WHERE product_id = (1,2,3);
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)
...
我在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
如果您意外地错过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
函数中!
另一个地方可能发生的另一个位置是分配一个在字符串之外具有逗号的值。例如:
SET totalvalue = (IFNULL(i.subtotal,0) + IFNULL(i.tax,0),0)
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)
在这里您使用子查询,但此子查询必须仅返回一列。将其分开,否则会显示错误。
我在制作公司数据库时也有同样的问题。这是代码
SELECT FNAME,DNO FROM EMP
WHERE SALARY IN (SELECT MAX(SALARY), DNO
FROM EMP GROUP BY DNO);
我也使用MySQL的Dapper提供了此错误消息。下面的示例代码:
SELECT ColA, ColB, ColC
FROM Table
WHERE ColA IN (@listOfColumns);
上述代码的问题是Dapper将自动添加括号@listofcolumns参数替换意味着上图中的括号将仔细包装导致错误的列列表。