在我正在创建的系统上工作时,我试图在我的项目中使用以下查询:
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
Run Code Online (Sandbox Code Playgroud)
":cat"由我的PHP代码绑定,因为我正在使用PDO.2是":cat"的有效值.
该查询虽然给我一个错误:"#1241 - 操作数应包含1列"
让我感到困惑的是,我认为这个查询没有问题.选择列,然后从另一个表中再选择两个,然后从那里继续.我只是无法弄清楚问题是什么.
是否有一个简单的解决方法,或其他方式来编写我的查询?
cdh*_*wie 84
您的子查询正在选择两列,而您正在使用它来投影一列(作为外部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
Run Code Online (Sandbox Code Playgroud)
sil*_*ire 11
如果您不小心使用逗号而不是AND在以下ON子句中使用逗号,也会发生此错误JOIN:
JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
^
should be AND, not a comma
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
好吧,你不能从一个子查询中获得多个列.幸运的是,第二栏已经是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)
...
Run Code Online (Sandbox Code Playgroud)
如果不小心在子句中使用=而不是,也会发生此错误:INWHERE
例如:
WHERE product_id = (1,2,3);
Run Code Online (Sandbox Code Playgroud)
就我而言,问题是我错误地用括号包围了我的列选择:
SELECT (p.column1, p.colum2, p.column3) FROM table1 p where p.column1 = 1;
Run Code Online (Sandbox Code Playgroud)
并且必须是:
SELECT p.column1, p.colum2, p.column3 FROM table1 p where p.column1 = 1;
Run Code Online (Sandbox Code Playgroud)
听起来很傻,但它导致了这个错误,需要一些时间才能弄清楚。
| 归档时间: |
|
| 查看次数: |
235914 次 |
| 最近记录: |