我已经在 SO 上搜索了一些答案,但没有找到我想要实现的目标,所以这里又出现了关于每组前 N 个的问题。
数据库结构
目前我有一个帖子表如下:
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排序,日期12
比日期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 个结果。
非常感谢任何帮助。
最佳答案
您请求的代码,也请填写我评论的 TODO。
<?php
$start = isset($_GET['start']) ? $_GET['start'] : 0;
$max_record = 3;
$sql = "
SELECT * FROM
post p INNER JOIN comment c
ON p.post_id = c.post_id
ORDER BY c.comment_date DESC LIMIT $start, $max_record
";
// TODO: create sql query.
$next = $start + $max_record;
?>
<p>SQL Start: <?php echo $start ?></p>
<p>SQL Max Record: <?php echo $max_record ?></p>
<a href="index.php?start=<?php echo $next ?>">Next</a>
我不需要解释所有事情,甚至是我提供的不安全脚本,但逻辑就在那里。
关于php - 使用 MySQL 分页查询每组前 N 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23844188/