0

我已经搜索了一些关于 SO 的答案,但没有人提出我想要实现的目标,所以这里有另一个关于每组前 N 个的问题。

数据库结构

目前我有一个 Post 表如下:

post_id | post_title | post_text

和如下评论表:

comment_id | post_id | comment_text | comment_date | ...

目标

  • 我想获得每篇由comment_datedesc 排序的帖子的前 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_datedesc 排序,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_datedesc 排序,则不能保证返回的结果正好是 n 个。

任何帮助是极大的赞赏。

4

1 回答 1

0

您请求的代码,也填写我评论的 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>

我不需要解释所有事情,即使是我提供的不安全脚本,但逻辑就在那里。

于 2014-05-24T11:28:44.383 回答