J'essaie de renvoyer les champs d'une seule ligne de la table un (messages) et de joindre à cette ligne le nombre de commentaires apparaissant dans une deuxième table (commentaires) pour cet article.
Cependant, il ne renvoie jamais la valeur de comptage.
SELECT posts.post_title, posts.post_author, posts.post_date, posts.post_article FROM posts LEFT OUTER JOIN (SELECT COUNT(*) FROM comments WHERE comments.comment_post_id = 25) AS comments ON posts.post_id = comments.comment_post_id WHERE post_id = 25;
Je sais qu'il me manque probablement quelque chose de simple, mais j'ai déjà passé beaucoup trop de temps là-dessus, alors j'ai pensé demander de l'aide. Comme je suis nouveau dans SQL, j'apprécierais vraiment une explication ainsi que des suggestions de changement de code.
3 Réponses :
Eh bien, vous n'avez pas besoin d'une jointure externe car la requête count si aura exactement une ligne. En supposant que vous vouliez faire cela, incluez post_id dans votre sous-requête.
SELECT posts.post_title, posts.post_author, posts.post_date, posts.post_article, ncomments FROM posts INNER JOIN (SELECT COUNT(*) AS ncomments FROM comments WHERE comments.comment_post_id = 25) AS comments
Sinon, je pense que cela devrait faire:
Cependant, il ne renvoie jamais la valeur de comptage.
SELECT posts.post_title, posts.post_author, posts.post_date, posts.post_article, ncomments FROM posts LEFT OUTER JOIN (SELECT post_id, COUNT(*) as ncomments FROM comments WHERE comments.comment_post_id = 25) AS comments ON posts.post_id = comments.comment_post_id WHERE post_id = 25;
deux voies pour ce problème.
solution unique et rapide.
select mainQueryPosts.post_title, mainQueryPosts.post_author, mainQueryPosts.post_date, mainQueryPosts.post_article,mainQueryPosts.count,mainQueryPosts.rownumber from ( SELECT posts.post_title, posts.post_author, posts.post_date, posts.post_article,count(*) over (partition by comments.comment_post_id) count, ROW_NUMBER() OVER (partition by comments.comment_post_id ORDER BY comments.CreateDate) rownumber FROM posts inner join comments on comments.comment_post_id = post.comment_post_id WHERE post_id = 25 ) mainQueryPosts where mainQueryPosts.rownumber=1
et la meilleure solution ..
SELECT posts.post_title, posts.post_author, posts.post_date, posts.post_article,(SELECT COUNT(*) FROM comments WHERE comments.comment_post_id = posts.comment_post_id)CountComment FROM posts post WHERE post_id = 25;
Nader Gharibian Fard
Je suggérerais d'utiliser une sous-requête corrélée:
SELECT p.post_title, p.post_author, p.post_date, p.post_article, (SELECT COUNT(*) FROM comments c WHERE c.comment_post_id = p.post_id ) as num_comments FROM posts p WHERE p.post_id = 25;
Cela vous permet efficacement d'avoir les 25
une seule fois dans la requête, ce qui réduit la portée des erreurs de codage.
Votre code ne fonctionne pas car vous ne sélectionnez pas la colonne de nombre dans le SELECT
externe. N'oubliez pas: une requête SQL décrit le jeu de résultats. Si vous n'avez pas de colonne ou d'expression dans SELECT
, elle ne sera pas sélectionnée.
Concis et fonctionne comme un charme! Merci également pour l'explication - j'ai lu l'ordre dans lequel les déclarations sont traitées, suite à votre suggestion.