选择最新的帖子及其最新评论

时间:2014-11-23 12:26:32

标签: mysql greatest-n-per-group

这是一个常见的最大n组问题,但有一个额外的问题。 我想要的是找到用户的最新20个帖子,并为每个帖子加载其最新的5(或n)个评论。此外,对于分页需求,我需要知道每个帖子有多少其他评论。是否可以使用相同的查询找到它? (或者至少需要效率较低的查询)

我现在所做的是找到最新的帖子及其评论(全部):

查找用户的最新帖子:

SELECT up.primkey
     , up.sender
     , up.comment
     , up.date
     , up.admin_approved
     , u.username
     , u.avatar
  FROM users_posts up
  JOIN users u
    ON up.sender=u.userkey
 WHERE up.sender=?
   AND up.admin_approved=0 
 ORDER 
    BY primkey DESC LIMIT $from,$to;

然后,我将每个primkey存储在一个数组中,以便检索这些帖子的评论。

查找帖子的评论:

SELECT c.primkey,c.post_id, c.sender, c.comment, c.date, u.username, u.avatar
FROM users_posts_comments c
LEFT JOIN users u ON c.sender=u.userkey
WHERE c.post_id IN('.implode(",", $posts_array).') AND c.`admin_approved`=0 
ORDER BY c.primkey DESC;

之后,我将每个评论存储到一个新数组($comments[$post_id][]=comment info),然后输出结果。

我想要的是修改第二个查询并将评论限制为最近的5个,并且还要以某种方式查找每个帖子的总评论数量以显示分页。

这是一个小提琴...... sqlfiddle.com /#!2 / e92a6 / 1

预期结果:

  

post8

     

post7

     
    

评论-7

         

评论-6

         

评论-5

         

{页}

  
     

post6

     

...

我知道这很难,所以你建议我做什么(最有效的方式)?

感谢。

1 个答案:

答案 0 :(得分:1)

更快的解决方案是使用变量 - 但我老了...

此查询为您提供每位发件人的最新5条帖子......

 SELECT x.* ,COUNT(*)
   FROM users_posts x 
   JOIN users_posts y 
     ON y.sender = x.sender 
    AND y.date >= x.date 
  GROUP 
     BY x.primkey 
 HAVING COUNT(*) <= 5

所以现在你可以扩展这个想法,为最后5个帖子(每个发件人)返回3条最新评论(如果有的话)

SELECT a.*, upc.*
   FROM 
      ( SELECT x.* 
          FROM users_posts x 
          JOIN users_posts y 
            ON y.sender = x.sender 
           AND y.date >= x.date 
         GROUP 
            BY x.primkey 
        HAVING COUNT(*) <= 5
      ) a
   LEFT
   JOIN users_posts_comments upc
     ON upc.post_id = a.primkey
   LEFT
   JOIN users_posts_comments z
     ON z.post_id = upc.post_id
    AND z.date >= upc.date
  GROUP
     BY a.sender 
      , a.primkey
      , upc.primkey 
 HAVING COUNT(upc.post_id) <= 3;