7

假设我们使用分页来拆分并显示这样的 mysql 结果,按自动增量 ID 和日期排序:

SELECT name FROM members ORDER BY id DESC, date DESC LIMIT $start, $len

我们使用 php 在其下方显示该结果和页面导航链接。

我们如何找到记录 ID 号 x 在该结果的哪个页面中,因此我们为该页面设置页码并显示该页面,最终用户不需要单击导航并找到它?

4

4 回答 4

6

首先获取记录总数。

select count(*) as total from members; 

在记录列表中找到行成员'x'的编号

select count(*) oneLess from members where id < (select id from members where name='x');

上面的查询返回 oneLess 来自 xie 'x' 的记录数是 oneLess+1

现在计算页码。

$asc_page_no =  floor((($oneLess+1)/$total)*$len);
$total_pages = floor($total/$len);
$page_no = $total_pages - $asc_page_no; //reverse the page looking direction

然后计算 $start

$start = $page_no * $len;
于 2013-09-09T08:41:57.070 回答
0

@Bere 有一个不错的解决方案,但问题是您的 PRIMARY KEY 是 autoinc 之一,因此 2 id 可能不是连续的。

您应该添加一列以放置您可以控制的数字。

在@Bere 的响应中使用程序但不使用主键后,使用新列。

于 2013-09-09T08:46:23.693 回答
0

首先,我们需要确定所需行所在的页码:

SELECT d.myRowSerial, FLOOR((d.myRowSerial-1)/10) AS pageNumber
-- Say, 10 is per page;
FROM (
    SELECT *, @rownum:=@rownum + 1 AS myRowSerial 
    FROM myTable, (SELECT @rownum:=0) AS nothingButSetInitialValue 
    WHERE 1=1 -- Optional: filter if required, otherwise, omit this line;
    ORDER BY AnyColumn -- Apply the order you like; 
) d
WHERE d.myColumn = 'Anything'; -- If you like to limit it to only
-- for any specific row(s), similar to the *MAIN query.

第 1 页的 pageNumber==0,第 2 页的 pageNumber==1,依此类推......然后我们可以通过简单的计算来简单地计算 OFFSET 数:

$offset = $myRowSerial * $perPage;

现在我们可以将这个 $offset 值用于我们的 MAIN 查询。

于 2014-05-22T06:44:50.863 回答
0

由于 Reza Mamun 提供了他的解决方案,它的效果非常好……我还想创建 SELECT HTML 元素来在页面之间导航。这需要另一种方法。

为了创建 SELECT 元素,我使用带有 'name' 和 'value' 键的数组,因此 SQL 查询看起来:

 $qry='
SELECT d.RowNumber, FLOOR( ( d.RowNumber ) / %s ) AS value, d.name 
    FROM( 
            SELECT  %s AS ID, 
                        %s AS name,
                        @rownum:=@rownum+1 AS RowNumber 
                FROM    %s, 
                        ( SELECT @rownum:=-1 ) AS Initialize 
                %s 
                %s 
         ) AS d
    WHERE d.Rownumber MOD %s = 0';


$sqry   = sprintf( $qry, $pagelength, $this->_tableindex, $sort_field, $this->_tablename, $cond, $sql_order, $pagelength );

查询使用 WHERE 过滤(由用户通过表单定义),排序 ORDER BY(由 used 选择)。我认为变量和属性的含义是可以区分的。该解决方案适用于(几乎)通用数据分页和用户定义的页面长度。

于 2019-01-17T07:40:15.803 回答