0

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

所以

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

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

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

这是问题所在

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

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

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

让我们说

$total_posts_intopic = 250 ;
$per_page            = 15 ;

我现在需要的是post #666找出页码 的偏移量

那么如何获得帖子#666之间的topic A帖子偏移量?

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

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

4

1 回答 1

0

有关完整演示,请参阅此 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;

查询的工作方式如下:

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