簡體   English   中英

使用MySQL分頁查詢每組的前N個

[英]Query for top N per group with pagination using MySQL

我已經在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排序, date 12date 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       | ...

我已經嘗試過類似的操作: 每組具有多個表聯接的前N個,但是如果我們按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>

我不需要解釋所有事情,甚至不需要我提供的不安全腳本,但是邏輯就在那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM