[英]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_id
, post_title
, post_text
,但是如果我們可以返回所有很棒的字段。 例
我有以下帖子:
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 | ...
我已經嘗試過類似的操作: 每組具有多個表聯接的前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.