web-dev-qa-db-fra.com

MySQL - L'opérande doit contenir 1 colonne (s)

Pendant que je travaillais sur un système que je crée, j'ai tenté d'utiliser la requête suivante dans mon projet:

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 lié à mon code PHP car j'utilise PDO. 2 est une valeur valide pour ": cat".

Cette requête me donne cependant une erreur: "# 1241 - L'opérande doit contenir 1 colonne (s)"

Ce qui me stresse, c'est que je penserais que cette requête ne fonctionnerait pas. Sélectionner des colonnes, puis deux autres dans une autre table et continuer à partir de là. Je ne peux tout simplement pas comprendre le problème.

Existe-t-il une solution simple à ce problème ou un autre moyen d'écrire ma requête?

66
user1543386

Votre sous-requête sélectionne deux colonnes, tandis que vous l'utilisez pour projeter une colonne (dans le cadre de la clause SELECT externe). Vous ne pouvez sélectionner qu'une colonne d'une telle requête dans ce contexte.

Pensez plutôt à vous joindre à la table users; cela vous donnera plus de flexibilité lors de la sélection des colonnes que vous voulez parmi 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
75
cdhowie

Cette erreur peut également se produire si vous utilisez accidentellement des virgules au lieu de AND dans la clause ON d'un JOIN:

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma
8
silkfire
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)

Eh bien, vous ne pouvez pas obtenir plusieurs colonnes d’une même sous-requête. Heureusement, la deuxième colonne est déjà posts.posted_by! Alors:

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

Cette erreur peut également se produire si vous utilisez accidentellement = au lieu de IN dans la clause WHERE:

PAR EXEMPLE:

WHERE product_id = (1,2,3);
2
jay padaliya

Cette erreur peut également se produire si vous manquez accidentellement le nom de la fonction if.

par exemple:

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

Vous avez ce problème lorsque j'ai manqué de mettre if dans la fonction if!

0
Jagan Kornana

Un autre endroit où cette erreur peut se produire est l’affectation d’une valeur comportant une virgule en dehors d’une chaîne. Par exemple:

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