MySQL – Opérande devrait contenir 1 colonne (s)

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 lorsque 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 stoppe, c’est que je pense que cette requête ne poserait aucun 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?

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 dans une telle requête dans ce contexte.

Envisagez de vous joindre à la table des users à la place; Cela vous donnera plus de flexibilité lors de la sélection des colonnes que vous voulez des 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 

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 
 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 sous-requête comme celle-ci. 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) ... 

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