这是一个常见的最大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
...
我知道这很难,所以你建议我做什么(最有效的方式)?
感谢。
答案 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;