我已经搜索了一些关于 SO 的答案,但没有人提出我想要实现的目标,所以这里有另一个关于每组前 N 个的问题。
数据库结构
目前我有一个 Post 表如下:
post_id | post_title | post_text
和如下评论表:
comment_id | post_id | comment_text | comment_date | ...
目标
- 我想获得每篇由
comment_date
desc 排序的帖子的前 n 条评论,并支持分页。如果可能,每个帖子必须返回 n 条评论,例如,如果帖子有 10 条评论,则应返回 3 条,如果帖子有 2 条评论,则只能返回 2 条。 - 应返回所有评论字段。
- 只有
post_id
,post_title
,post_text
需要返回,但如果我们可以返回所有字段那就太好了。 - 如果可能,帖子应该只出现一次,即如果它在第 1 页,那么在第 2 页将不会被考虑(请参见下面的示例)。我认为这比允许帖子多次出现更容易实现。
例子
我有以下帖子:
post_id | post_title | post_text
++++++++++++++++++++++++++++++++
1 | ... | ...
2 | ... | ...
3 | ... | ...
4 | ... | ...
和以下评论(按comment_date
desc 排序,date 12
比 更新date 11
):
comment_id | post_id | comment_date | ...
+++++++++++++++++++++++++++++++++++++++++
12 | 1 | date 12 | ...
11 | 2 | date 11 | ...
10 | 2 | date 10 | ...
9 | 2 | date 9 | ...
8 | 3 | date 8 | ...
7 | 1 | date 7 | ...
6 | 4 | date 6 | ...
5 | 2 | date 5 | ...
4 | 2 | date 4 | ...
3 | 1 | date 3 | ...
2 | 1 | date 2 | ...
1 | 1 | date 1 | ...
假设我每页限制为 6 条评论,并且n
是 3 条。预期结果是:
Page 1:
comment_id | post_id | comment_date | ...
+++++++++++++++++++++++++++++++++++++++++
12 | 1 | date 12 | ...
11 | 2 | date 11 | ...
10 | 2 | date 10 | ...
9 | 2 | date 9 | ...
7 | 1 | date 7 | ...
3 | 1 | date 3 | ...
Page 2
comment_id | post_id | comment_date | ...
+++++++++++++++++++++++++++++++++++++++++
8 | 3 | date 8 | ...
6 | 4 | date 6 | ...
我已经尝试过类似的事情:Top N Per Group with Multiple Table Joins但是如果我们按comment_date
desc 排序,则不能保证返回的结果正好是 n 个。
任何帮助是极大的赞赏。