MySQL – 操作数应该包含1列(s)

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

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列(S)”

困扰我的是我认为这个查询不会有问题。 select列,然后从另一个表中select两个,然后从那里继续。 我只是无法弄清楚问题所在。

有没有一个简单的修复,或者另一种方式来写我的查询?

您的子查询select了两列,而您正在使用它来投影一列(作为外部SELECT子句的一部分)。 在这种情况下,您只能从这样的查询中select一列。

考虑joinusers表,而不是; 这将使您在selectusers需要的列时有更大的灵活性。

 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 
 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) ... 

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

例如:

 WHERE product_id = (1,2,3);