所选行之间特定行的偏移量

时间:2013-08-21 00:50:33

标签: php mysql

我为我的网站写了一个非常小的论坛..我真的不想使用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号帖子表示在topic A

以外的所有主题中总共有666个帖子

1 个答案:

答案 0 :(得分:0)

请参阅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'创建'0时(当它查看countTable子句时)变量设置为FROM,并且每次选择一行时该变量加1(因为SELECT子句是为每个结果行“执行”的。)
  • 因为WHERE子句(选择正确的主题)是在 SELECT子句之前“执行”,所以只有您感兴趣的主题中的行才能获得反击增加。
  • 前面步骤的结果是一个新表associatedCountTable,其中所选主题中的每个帖子都有一行。每行在第一列中都有帖子id,在第二列中有一个名为currentCount的简单递增计数器。
  • 最终WHERE子句采用上表,并选择您感兴趣的帖子id的行的计数器列(示例中为666)。< / LI>