假设我们使用分页来拆分并显示这样的 mysql 结果,按自动增量 ID 和日期排序:
SELECT name FROM members ORDER BY id DESC, date DESC LIMIT $start, $len
我们使用 php 在其下方显示该结果和页面导航链接。
我们如何找到记录 ID 号 x 在该结果的哪个页面中,因此我们为该页面设置页码并显示该页面,最终用户不需要单击导航并找到它?
假设我们使用分页来拆分并显示这样的 mysql 结果,按自动增量 ID 和日期排序:
SELECT name FROM members ORDER BY id DESC, date DESC LIMIT $start, $len
我们使用 php 在其下方显示该结果和页面导航链接。
我们如何找到记录 ID 号 x 在该结果的哪个页面中,因此我们为该页面设置页码并显示该页面,最终用户不需要单击导航并找到它?
首先获取记录总数。
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;
@Bere 有一个不错的解决方案,但问题是您的 PRIMARY KEY 是 autoinc 之一,因此 2 id 可能不是连续的。
您应该添加一列以放置您可以控制的数字。
在@Bere 的响应中使用程序但不使用主键后,使用新列。
首先,我们需要确定所需行所在的页码:
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 查询。
由于 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 选择)。我认为变量和属性的含义是可以区分的。该解决方案适用于(几乎)通用数据分页和用户定义的页面长度。