php - 使用 MySQL 分页查询每组前 N 个

标签 php mysql top-n

我已经在 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_idpost_titlepost_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/

相关文章:

php - 为什么我需要转换这个 bool 表达式?

php - BCRYPT 和 Random SALTS 在数据库中一起

sql - 显示姓名和最大年龄

c++ - 在我的 friend 圈中找到最受欢迎的点赞

javascript - 将多维 JSON 打印为 html 表单输入,名称为属性的 xpath

php - 循环遍历 URL 参数并添加到 mySQL

mysql - 在Linux(Kubuntu)上从MySQL迁移到PostgreSQL

php - 如何显示来自mysql的图片

mysql - 无法在没有维护时间的情况下创建同步的新 AWS RDS(mysql) 副本

MySQL 查询 : How can I find top 5 images in each brand ?