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.