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


92

Tout en travaillant 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é 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 me dérange, c'est que je pense que cette requête ne fonctionnerait pas. Sélectionner des colonnes, puis en sélectionner deux autres dans une autre table, et continuer à partir de là. Je n'arrive tout simplement pas à comprendre quel est le problème.

Existe-t-il une solution simple à cela ou une autre façon d'écrire ma requête?

Réponses:


103

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

Envisagez usersplutôt de vous joindre à la table; cela vous donnera plus de flexibilité lors de la sélection des colonnes que vous voulez 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

Merci pour la réponse. Je vais corriger ma requête et vous marquer comme réponse, mais juste pour l'entrée, pensez-vous qu'il existe une "meilleure" façon d'écrire ma requête que celle que j'utilise actuellement (mais aussi en ignorant l'erreur)?

Ah. Merci pour la modification de votre message d'origine. Je ne manquerai pas de vous marquer comme la réponse lorsque StackOverflow me le permettra. Merci beaucoup!

Eh bien, COUNT()cela gâche un peu les choses; la requête que j'ai donnée donnera probablement une erreur en raison de l'agrégation. Vous devrez peut-être déplacer cette agrégation dans une sous-requête, en fonction des objectifs de votre requête (qui ne sont pas clairs pour moi pour le moment).
cdhowie

17

Cette erreur peut également se produire si vous utilisez accidentellement des virgules au lieu de ANDdans la ONclause d'un JOIN:

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

9

Cette erreur peut également se produire si vous utilisez accidentellement =au lieu de INdans la WHEREclause:

PAR EXEMPLE:

WHERE product_id = (1,2,3);

1
Ou LIKE au lieu de IN comme je l'ai fait et je n'ai pas pu trouver pourquoi cette erreur se produit. ty pour le pointeur.
Edgars Aivars

Cela peut également arriver si vous mettez des crochets autour des champs dans la clause SELECT, par exemple SELECT (Champ1, Champ2) 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)

Eh bien, vous ne pouvez pas obtenir plusieurs colonnes à partir d'une sous-requête comme celle-ci. Heureusement, la deuxième colonne est déjà posts.posted_by! Donc:

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

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

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

Et doit être:

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

Cela semble idiot, mais cela causait cette erreur et il a fallu un certain temps pour la comprendre.


Je ne peux pas croire que c'est mon problème, je pensais que les parenthèses étaient légales là
Josh McGee

0

Cette erreur peut également se produire dans l'attribution 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

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

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

J'ai eu ce problème quand j'ai manqué de mettre si dans la iffonction!


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

Ici, vous utilisez une sous-requête mais cette sous-requête ne doit renvoyer qu'une seule colonne. Séparez-le sinon il affichera une erreur.


0

J'ai eu cette erreur lors de l'exécution d'un script MySQL dans une console Intellij, en raison de l'ajout de crochets au mauvais endroit:

FAUX:

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

DROITE:

SELECT user.id
FROM user
WHERE id IN :ids; # No brackets is correct

cela ne correspond pas à la première réponse ici: stackoverflow.com/questions/24551177/…
rubydio

@rubydio, cette question fait référence à HQL et Hibernate, alors que ma réponse fait référence à MySQL dans une console
Intellij
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.