131 votes

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

En travaillant sur un système que je suis en train de créer, j'ai essayé 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é par 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 m'étonne, c'est que je pensais que cette requête fonctionnerait sans problème. Sélectionner des colonnes, puis en sélectionner deux autres dans une autre table, et continuer à partir de là. Je n'arrive pas à comprendre quel est le problème.

Existe-t-il une solution simple à ce problème, ou une autre façon d'écrire ma requête ?

139voto

cdhowie Points 62253

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

Envisagez d'adhérer à la users à la place ; cela vous donnera plus de flexibilité pour sélectionner les colonnes que vous souhaitez obtenir de la table 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

34voto

Mauro Bilotti Points 388

Dans mon cas, le problème est que j'ai entouré ma sélection de colonnes de parenthèses par erreur :

SELECT (p.column1, p.column2, p.column3) FROM table1 p WHERE p.column1 = 1;

Et doit l'être :

SELECT p.column1, p.column2, p.column3 FROM table1 p WHERE p.column1 = 1;

Cela semble idiot, mais c'est ce qui causait cette erreur et il a fallu du temps pour le découvrir.

24voto

silkfire Points 5745

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

JOIN joined_table ON (joined_table.column = table.column, joined_table.column2 = table.column2)
                                                        ^
                                             should be AND, not a comma

17voto

jay padaliya Points 126

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

PAR EXEMPLE :

WHERE product_id = (1,2,3);

7voto

minitech Points 87225
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 à partir d'une sous-requête comme ça. 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)
...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X