【问题标题】:offset of specific row between selected rows选定行之间特定行的偏移量
【发布时间】:2013-08-21 00:50:33
【问题描述】:

我正在为我的网站编写一个非常小的论坛。我真的不想使用 vb 和其他论坛系统。

所以

topics ( title , id )
posts  ( text , id , topic_id )

有一个页面显示给定用户的所有条目(帖子)

在每个用户帖子的此页面中,我会显示主题名称和该帖子的简短摘要

问题来了

当我点击主题名称时..我不想转到主题的第一页。 我想要包含该特定帖子的确切页面。

所以我知道了帖子 ID(比如说 666) 我可以使用它来获取主题信息(比如说标题:topic A

所以我可以得到topic A 中的帖子总数

让我们说

$total_posts_intopic = 250 ;
$per_page            = 15 ;

我现在只需要post #666 的偏移量来计算页码

那么我怎样才能在topic A 帖子之间获得帖子#666 的偏移量?

或者有没有更简单的方法来做到这一点?

注意:666 号帖子意味着它在所有不在topic A 中的主题中总共有 666 个帖子

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    请参阅this SQL Fiddle 了解完整演示。

    我使用的查询(适用于您的示例)如下。这个想法是你填写topic_id(我目前有topic_id = 1)和帖子的id(我目前有id = 666)。结果将是一个数字,指示给定帖子在给定主题中的位置。

    要确定页码,您可以使用:

    $pageNumber = floor(($queryResult - 1) / $postsPerPage);
    

    查询:

    SELECT
      currentCount
    FROM
      (
        SELECT
          id,
          @counter := @counter + 1 AS currentCount
        FROM
          posts,
          (SELECT @counter := 0) AS countTable
         WHERE
           topic_id = 1
      ) AS associatedCountTable
    WHERE
      id = 666;
    

    查询工作如下:

    • posts 表与计数器变量交叉连接。这是因为当 MySQL“创建”countTable(当它查看 FROM 子句时)时变量设置为 0,并且每次选择一行时该变量都会增加 1(因为 SELECT 子句为每个结果行“执行”)。
    • 因为WHERE 子句(选择正确的主题)在SELECT 子句之前被“执行”,所以只有您感兴趣的主题中的行才会获得计数器增加。
    • 前面步骤的结果是一个新表associatedCountTable,其中所选主题中的每个帖子都有一行。每一行的第一列都有帖子的id,第二列有一个简单递增的计数器,名为currentCount
    • 最后的WHERE 子句采用上表并为您感兴趣的帖子的id 所在行选择计数器列(在您的示例中为666)。

    【讨论】:

      猜你喜欢
      • 2013-08-24
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多