1
votes

Nombre de jointures à gauche (*) de la deuxième table

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.


0 commentaires

3 Réponses :


0
votes

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; 


0 commentaires

0
votes

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


0 commentaires

1
votes

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.


1 commentaires

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.