首页 > 解决方案 > 按类别对查询结果进行分页

问题描述

我正在尝试创建一个查询以获取特定论坛类别的 25 个论坛主题(每页),然后尝试按 ID 降序排列它们以首先显示最新帖子,但我似乎无法让它工作。 ..

这是 PHP 和 SQL

$category =  $_GET['category'];
$show_thr_max =  $_GET['thr'];
$show_thr_min =  $show_thr_max - 24;

$threadsq = "SELECT * FROM `forum_post` WHERE `post_cate_id` = '$category' AND `id` BETWEEN '$show_thr_min' AND '$show_thr_max'";
$threadsr = mysqli_query($con, $threadsq);

$category是要从中获取相关线程的类别的 ID,

$show_thr_ max设置为 25,每页通过时递增 25,这是要抓取的最大线程范围。

$shrow_thr_min设置要抓取的线程的最小范围(小于 _max 24)。

该查询正在抓取范围之间的线程,它们来自正确的类别,尽管它抓取的是它可以找到的前 25 个,而不是具有最高 id 的 25 个。

所以第一页会显示 ids 25 到 1,而不是 91 到 66,这是想要的结果

我知道 SQL for 子句中有一个优先表,这可能是原因吗?在满足所有条件之前订购?

十分感谢你的帮助 :)

标签: phpsqlmysqli

解决方案


LIMIT/OFFSET您可能只需在此处使用查询即可逃脱:

SELECT *
FROM forum_post
ORDER BY id DESC
LIMIT 25
OFFSET 25;     -- replace 25 with whatever page you want

有些人对使用限制/偏移进行分页持批评态度,因为有时新数据可能会进入前一页,从而摆脱分页逻辑。但是,就您而言,过去发布的帖子无法添加或更改(很可能)。因此,在这种情况下,限制/偏移应该是一个可行的选择。

如果你真的想处理自己的分页,那么使用id可能会有问题,因为不能保证它是完全顺序的(除非你自己严格控制它)。


推荐阅读