MySQL: el operando debe contener 1 columna (s)

92

Mientras trabajaba en un sistema que estoy creando, intenté usar la siguiente consulta en mi proyecto:

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 por mi código PHP ya que estoy usando PDO. 2 es un valor válido para ": cat".

Sin embargo, esa consulta me da un error: "# 1241 - El operando debe contener 1 columna (s)"

Lo que me desconcierta es que pensaría que esta consulta funcionaría sin problemas. Seleccionar columnas, luego seleccionar dos más de otra tabla y continuar desde allí. Simplemente no puedo entender cuál es el problema.

¿Existe una solución simple para esto u otra forma de escribir mi consulta?

Bill Karwin
fuente

Respuestas:

103

Su subconsulta selecciona dos columnas, mientras la usa para proyectar una columna (como parte de la SELECTcláusula externa ). Solo puede seleccionar una columna de dicha consulta en este contexto.

Considere unirse a la usersmesa en su lugar; esto le dará más flexibilidad al seleccionar de qué columnas desea 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
fuente
Gracias por la respuesta. Arreglaré mi consulta y lo marcaré como la respuesta, pero solo como entrada, ¿cree que hay una forma "mejor" de escribir mi consulta que la que estoy usando ahora (pero también sin tener en cuenta el error)?
¡Ah! Gracias por editar tu publicación original. Me aseguraré de marcarlo como la respuesta cuando StackOverflow me lo permita. ¡Muchas gracias!
Bueno, COUNT()está tirando un poco las cosas; la consulta que he dado probablemente dará un error debido a la agregación. Es posible que deba mover esa agregación a una subconsulta, según los objetivos de su consulta (que no me quedan claros en este momento).
cdhowie
17

Este error también puede ocurrir si accidentalmente usa comas en lugar de ANDen la ONcláusula de a JOIN:

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

Este error también puede ocurrir si accidentalmente usa en =lugar de INen la WHEREcláusula:

POR EJEMPLO:

WHERE product_id = (1,2,3);
Jay Padaliya
fuente
1
O LIKE en lugar de IN como lo hice y no pude encontrar por qué ocurre este error. ty para puntero.
Edgars Aivars
También puede suceder si coloca corchetes alrededor de los campos en la cláusula SELECT, por ejemplo, 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)

Bueno, no puede obtener múltiples columnas de una subconsulta como esa. ¡Afortunadamente, la segunda columna ya está posts.posted_by! Entonces:

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-
fuente
1

En mi caso, el problema fue que rodeé mi selección de columnas entre paréntesis por error:

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

Y tiene que ser:

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

Suena tonto, pero estaba causando este error y tomó algún tiempo resolverlo.

Mauro Bilotti
fuente
No puedo creer que este sea mi problema, pensé que los corchetes eran legales allí
Josh McGee
0

Otro lugar en el que puede ocurrir este error es la asignación de un valor que tiene una coma fuera de una cadena. Por ejemplo:

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

Este error también puede ocurrir si accidentalmente pierde if nombre de la función.

por ejemplo:

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

¡Tengo este problema cuando no puse if en la iffunción!

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

Aquí utiliza la subconsulta, pero esta subconsulta debe devolver solo una columna. Sepárelo, de lo contrario, mostrará un error.

Moshiur Rahman
fuente
0

Recibí este error al ejecutar un script MySQL en una consola Intellij, debido a que agregué corchetes en el lugar equivocado:

INCORRECTO:

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

CORRECTO:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct
Janac Meena
fuente
esto no coincide con la primera respuesta aquí: stackoverflow.com/questions/24551177/…
rubydio
@rubydio, esa pregunta hace referencia a HQL e Hibernate, mientras que mi respuesta se refiere a MySQL en una consola
Intellij