MySQL - Operando deve conter 1 coluna (s)

92

Ao trabalhar em um sistema que estou criando, tentei usar a seguinte consulta em meu projeto:

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" está vinculado ao meu código PHP porque estou usando o PDO. 2 é um valor válido para ": cat".

Essa consulta, porém, me dá um erro: "# 1241 - Operando deve conter 1 coluna (s)"

O que me deixa perplexo é que eu acho que essa consulta funcionaria sem problemas. Selecionando colunas, depois selecionando mais duas de outra tabela e continuando a partir daí. Simplesmente não consigo descobrir qual é o problema.

Existe uma solução simples para isso ou outra maneira de escrever minha consulta?

Bill Karwin
fonte

Respostas:

103

Sua subconsulta está selecionando duas colunas, enquanto você a usa para projetar uma coluna (como parte da SELECTcláusula externa ). Você só pode selecionar uma coluna de tal consulta neste contexto.

Considere juntar-se à usersmesa; isso lhe dará mais flexibilidade ao selecionar as colunas que deseja 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
Cdhowie
fonte
Obrigado pela resposta. Vou corrigir minha consulta e marcá-lo como resposta, mas apenas para entrada, você acha que existe uma maneira "melhor" de escrever minha consulta do que a que estou usando agora (mas também desconsiderando o erro nela)?
Ah. Obrigado pela edição em sua postagem original. Com certeza marcarei você como a resposta quando o StackOverflow permitir. Muito obrigado!
Bem, COUNT()está confundindo um pouco as coisas; a consulta que dei provavelmente dará um erro devido à agregação. Você pode precisar mover essa agregação para uma subconsulta, dependendo dos objetivos de sua consulta (que não estão claros para mim no momento).
cdhowie
17

Este erro também pode ocorrer se você acidentalmente usar vírgulas em vez de ANDna ONcláusula de JOIN:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma
fogo de seda
fonte
9

Este erro também pode ocorrer se você acidentalmente usar em =vez de INna WHEREcláusula:

POR EXEMPLO:

WHERE product_id = (1,2,3);
Jay Padaliya
fonte
1
Ou LIKE em vez de IN como eu fiz e não consegui descobrir por que esse erro acontece. ty para ponteiro.
Edgars Aivars
Isso também pode acontecer se você colocar colchetes ao redor dos campos na cláusula SELECT, por exemplo, SELECT (Field1, Field2) FROM Table
Paul Chris Jones
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)

Bem, você não pode obter várias colunas de uma subconsulta como essa. Felizmente, a segunda coluna já existe posts.posted_by! Então:

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)
...
Ry-
fonte
1

No meu caso, o problema foi que eu coloquei minha seleção de colunas entre parênteses por engano:

SELECT (p.column1, p.colum2, p.column3) FROM table1 p where id = 1;

E tem que ser:

SELECT p.column1, p.colum2, p.column3 FROM table1 p where id = 1;

Parece bobo, mas estava causando esse erro e demorou algum tempo para descobrir.

Mauro Bilotti
fonte
Eu não posso acreditar que esse é o meu problema, eu pensei que colchetes fossem legais lá
Josh McGee
0

Outro lugar em que esse erro pode ocorrer é atribuindo um valor que tem uma vírgula fora de uma string. Por exemplo:

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

Este erro também pode ocorrer se você acidentalmente perder o ifnome da função.

por exemplo:

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

Tive esse problema quando falhei colocar if na iffunção!

Jagan Kornana
fonte
0
(SELECT users.username AS posted_by,
users.id AS posted_by_id
FROM users
WHERE users.id = posts.posted_by)

Aqui você usa subconsulta, mas esta subconsulta deve retornar apenas uma coluna. Separe-o, caso contrário, ele mostrará erro.

Moshiur Rahman
fonte
0

Recebi este erro ao executar um script MySQL em um console Intellij, devido à adição de colchetes no lugar errado:

ERRADO:

SELECT user.id
FROM user
WHERE id IN (:ids); # Do not put brackets around list argument

DIREITO:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct
Janac Meena
fonte
isso não corresponde à primeira resposta aqui: stackoverflow.com/questions/24551177/…
rubydio
@rubydio, essa pergunta faz referência a HQL e Hibernate, enquanto minha resposta se refere a MySQL em um console Intellij
Janac Meena