J'ai une requête qui interroge actuellement une table Post
tandis que LEFT JOINing une table Comment
. Il récupère tous les messages et leurs commentaires respectifs. Cependant, je veux limiter le nombre de commentaires retournés. J'ai essayé d'ajouter un sous-select, mais j'ai rencontré des erreurs si je n'ai pas LIMITE les résultats à 1. Je ne suis pas vraiment sûr de la façon de procéder à ce sujet tout en utilisant une seule requête. Est-ce possible?Est-il possible de LIMITER les résultats d'une requête JOIN?
0
A
Répondre
2
Celui-ci devrait obtenir vos messages avec les trois commentaires les plus récents par poste, en supposant que vos tables ressemblent que:
poste:
id
, post_text
commenter:
id
, post_id
, comment_text
SELECT id, post_text, comment_text
FROM
(
SELECT p.id, p.post_text, c.comment_text
CASE
WHEN @id != p.id THEN @row_num := 1
ELSE @row_num := @row_num + 1
END AS rank,
@id := p.id
FROM post p
LEFT JOIN comment c ON (c.post_id = p.id)
JOIN (SELECT @id:=NULL, @row_num:=0) x
ORDER BY p.id,
c.id DESC -- newest comments first
) y
WHERE rank <= 3;
La sous-requête est utilisée pour obtenir des commentaires récents et les numéroter par poste, tandis que les sélections externes Enlève les commentaires plus anciens.
1
Vous ne pouvez pas limiter une jointure, sauf si vous avez une valeur appropriée à filtrer (par exemple, where pos between 1 and 5
). Vous pouvez sélectionner le premier commentaire séparément, le deuxième commentaire, le troisième commentaire et ainsi de suite, et fusionner les résultats. Quelque chose laid comme:
select This, That
from Post
left join (
select Some
from Comment
where PostId = Post.Id
order by CreatedDate
limit 1,1
) x on 1=1
union all
select This, That
from Post
inner join (
select Some
from Comment
where PostId = Post.Id
order by CreatedDate
limit 2,1
) x on 1=1
union all
select This, That
from Post
inner join (
select Some
from Comment
where PostId = Post.Id
order by CreatedDate
limit 3,1
) x on 1=1
Vous pourriez obtenir de meilleurs résultats si vous publiiez votre requête actuelle. –