MySQL - COUNT并从子查询中检索n行

时间:2012-03-11 03:01:46

标签: mysql sql subquery greatest-n-per-group

背景:

  • 我有一个应用程序,在主页上显示帖子和评论。
  • 我的目的是限制所显示的帖子数量(即10个帖子)和......
  • 限制每篇帖子显示的评论数量(即2条评论)。
  • 显示前端的评论总数(即“阅读所有10条评论”)

MySQL的:

(SELECT *
 FROM   (SELECT *
         FROM   post
         ORDER  BY post_timestamp DESC
         LIMIT  0, 10) AS p
        JOIN user_profiles
          ON user_id = p.post_author_id
        LEFT JOIN (SELECT *
                   FROM   data
                          JOIN pts
                            ON pts_id = pts_id_fk) AS d
          ON d.data_id = p.data_id_fk
        LEFT JOIN (SELECT *
                   FROM   comment
                          JOIN user_profiles
                            ON user_id = comment_author_id
                   ORDER  BY comment_id ASC) AS c
          ON p.post_id = c.post_id_fk))

我未能在此代码中插入LIMITCOUNT以获得我想要的内容 - 任何建议? - 如果需要,将很乐意发布更多信息。

2 个答案:

答案 0 :(得分:0)

如果我正确理解你,你想要在返回的结果集中为每个唯一用户返回不超过10篇帖子(和2条评论)。

使用“row_number()PARTITION BY”在SQLServer / Oracle / Postgre中非常容易。

不幸的是MySql中没有这样的功能。这里也提出了类似的问题:
ROW_NUMBER() in MySQL

对不起,我无法为MySql提供更具体的解决方案。绝对进一步研究MySql的“行号分区”等价物。

这样做的本质:

您可以添加一组构成唯一集合的列,例如用户ID,例如缘故(这是“分区”)然后将“行号”列添加到与该分区匹配的每一行并重新开始当它发生变化时。

这应该说明:

user_id  row_number
1        1
1        2
1        3
2        1
2        2

然后,您可以添加一个外部查询,其中说明:select row_number< = 10,在您的情况下可以使用它来限制不超过10个帖子。使用该用户的max row_number来确定“读取所有10条评论”部分。

祝你好运!

答案 1 :(得分:0)

这是您正在寻找的查询的骨架:

select * from (
  select p1.id from posts p1
  join posts p2 on p1.id <= p2.id
  group by p1.id
  having count(*) <= 3
  order by p1.post_timestamp desc
) p left join (
  select c1.id, c2.post_id from comments c1
  join comments c2 on c1.id <= c2.id and c1.post_id = c2.post_id
  group by c1.id
  having count(*) <= 2
  order by c1.comment_timestamp desc
) c
on p.id = c.post_id

它会按照下降时间戳排序,但只有前三个。该结果将通过下降时间戳与每个帖子顺序的前2个评论相结合。只需更改列名称即可使用:)