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?
fonte
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).Este erro também pode ocorrer se você acidentalmente usar vírgulas em vez de
AND
naON
cláusula deJOIN
:fonte
Este erro também pode ocorrer se você acidentalmente usar em
=
vez deIN
naWHERE
cláusula:POR EXEMPLO:
fonte
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) ...
fonte
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.
fonte
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)
fonte
Este erro também pode ocorrer se você acidentalmente perder o
if
nome 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
if
função!fonte
(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.
fonte
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
fonte