如何计算分页的偏移量


How do I calculate the offsets for pagination?

我正在编写的Web服务中开发分页功能,但是我现在缺乏数学洞察力。我有几个键:totalItemscurrentItemscurrentPagetotalPages,还有几个指向firstlastpreviousnext的链接。

此时,我正在进行以下计算:

  • totalItems:表中的行数
  • currentItems:来自 HTTP 请求limit参数
  • currentPagestart参数除以limit参数
  • totalPages:表中的行数除以limit。(四舍五入,8.1页=9页)

我认为这些计算是正确的,我正在努力解决以下几点:

  • firststart参数为 1,limit来自 HTTP 请求
  • last:应该是最后一页的第一项,如何正确计算?
  • previous:应该是前一页的第一项,我该怎么做?
  • next:应该是下一页的第一项,我该怎么做?

我想问的是:我的计算正确吗?我如何用lastpreviousnext解决这三个问题?

如果你使用 mysql 它的

LIMIT offset, items_per_page

要计算偏移量,您可以使用

$offset = ($page - 1) * $items_per_page;

然后相应地更换$page

最后

$last_offset = ($totalPages - 1) * $items_per_page;

以前

$previous_offset = (($currentPage - 1) - 1) * $items_per_page;

下一个

$next_offset = (($currentPage + 1) - 1) * $items_per_page;

编辑:

if ($previous_offset > 0) echo '<a href="?start='.$previous_offset.'&limit='.$items_per_page.'>prev</a>';

if ($next_offset <= $totalPages * $items_per_page) echo '<a href="?start='.$next_offset.'&limit='.$items_per_page.'">prev</a>';

我浏览了很多文章并创建了非常简单的分页公式

offset = (limit * page no) - limit

例如,如果限制为 5

LIMIT 5
    page 1 
        offset : no (No need to use offset)
        (5 - 1) - 5
         select * from users limit 5
    page 2
        offset : 5
        (5 * 2) - 5
        select * from users limit 5 offset 5
    page 3 
        offset 10
        (5 * 3) - 5
        select * from users limit 5 offset 10
    page 4 
        offset 15
        (5 * 4) - 5
        select * from users limit 5 offset 15

从表名限制中选择 * 偏移值 5(根据公式计算)

这对我有用

如果限制是指每页的项目数,则:

currentItems: same as limit
currentPage: floor(start / limit)
totalPages: ceil(totalItems / limit)
last: totalPages * limit
previous: (currentPage-1) * limit // Should be greater or equal to 0
next: (currentPage+1) * limit // Should be less or equal than totalPages

这只是一个近似值...

在这里,

我在下面使用了代码并且工作正常。

<?php
//curpage = current page;
//-1 = for adjust actual page;
//30 = total post for each page;
//5 = jump or offset determided for start count post 
?>
<?php $offset = (($curpage - 1) * 30) + 5 ;?>
<!-- print for view test -->
<h1><?php echo $offset ?></h1>
<?php
    $args_2 = array(
      'offset' => $offset,
      'post_type' => 'post',
      'posts_per_page' => 30,
      'category_name'     => $cat_filter,
      'post_status' => 'publish',
      'paged' => $paged
    );
  $query = new WP_Query( $args_2 );
  if ( $query->have_posts() ) :
    while ( $query->have_posts() ) : $query->the_post();
      ?>