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?
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
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 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)
...
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);
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
!
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)