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?

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

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

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

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

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.


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)

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!


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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.