2010-03-17 6 views
0

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?

+1

Vous pourriez obtenir de meilleurs résultats si vous publiiez votre requête actuelle. –

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 
Questions connexes