php - 从分页论坛中的帖子永久链接确定页面

标签 php mysql permalinks

我论坛中的帖子都有一个单独的永久链接。

帖子已分页,用户可以按日期和评级对帖子进行排序。

访问固定链接时,由于分页,需要计算帖子所在的页面。

帖子以自动递增的 ID 存储在 mysql innodb 表中。

目前,当帖子按分数(评级)排序时,我使用以下方法进行计算:

<?php

    // These variables originate from the corresponding uri segments
    // For example: http://domain.tld/topics/[ID]/[SLUG]/[POST_ID]
    $post_id  = $uri->segment(4);
    $topic_id = $uri->segment(2);

    $post_per_page = 10;

    $query = $db->query('SELECT id FROM topic_posts WHERE topic_id = ' . $topic_id . ' ORDER BY score desc');

    foreach ($query as $key => $post)
    {
        if ($post->id == $post_id)
        {
            $postOnPage = ceil(($key + 1) / $post_per_page);
            break;
        }
    }

但是,帖子数量会不断增加,获取所有帖子似乎很尴尬。

对于日期排序,我使用以下查询,但它不适用于评级排序,因为帖子 ID 不按递增顺序:

SELECT CEIL((COUNT(*) + 1) / $posts_per_page) FROM topic_posts WHERE topic_id = $topic_id AND id < $post_id;

那么...我怎样才能避免 php foreach 循环并通过 db 查询实现相同的效果?

最佳答案

我只是想到了一种完全不同的方法,所以我将其添加为第二个答案,而不是编辑第一个答案。

为了使其按预期工作,您始终必须在排序中包含至少一个唯一列作为平局打破者。我假设您的许多帖子实际上都有相同的评级,所以也许您应该例如 ORDER BY Score DESC, id DESC 来另外排序与最新的评级相同的帖子(我认为这可能无论如何,对于论坛来说是有意义的)。

然后,对于上面提到的排序顺序,您可以使用以下查询获取在相关帖子之前排序的帖子数量:

SELECT COUNT(1) FROM topic_posts
  WHERE topic_id = $topic_id
        AND ((score > $post_score) OR (score = $post_score AND id > $post_id));

这是一个您可以根据需要使用 indizes 等进行优化的查询。

关于php - 从分页论坛中的帖子永久链接确定页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19255560/

相关文章:

php - PrestaShop:允许客户上传 PDF、AI 和 EPS 文件作为产品定制

php - php 中时间戳的平均每日金额

mysql - 查找MySQL中的重复记录2

php - 样式die()错误消息

php - Wordpress 主题操作 - 删除小部件背景

php - 在 laravel 5.4 中为 mysql join 语句创建一个 PHP 多维数组,该数组为用户 id 返回多行

php - 使用bash从mysql获取数据

WordPress 重写仅向页面添加基本前缀

wordpress - 如何使静态页面永久链接看起来漂亮

php - 与 PHP 的永久链接