最後更新:2016-06-01
來源:互聯網
上載者:User
關鍵字
探討
處理
記錄
id
echo
起始
取得
ord
php+mysql分頁處理的探討
常見的分頁處理流程為:
1、用select count(*) from tbl_name取得待分頁的總記錄數
2、根據每頁的記錄數計算出總頁數:總頁數 = ceil(總記錄數/每頁記錄數)
3、根據當前頁號計算出起始位置:起始位置 = (當前頁號-1)*每頁記錄數
4、用select * from tbl_name limit 起始位置,每頁記錄數 取得待顯示記錄
5、列表輸出相關資訊
在這個流程中,資料庫需要兩次遍曆表才能得到所需資料。儘管limit會在得到指定記錄數後會終止遍曆,但前面直到“起始位置”的檢索是浪費掉的。
這裡提出一種新演算法與大家討論:
1、利用mysql的使用者變數,分割並提取每頁起始的id號。
2、查詢結果的記錄數即為總頁數
3、根據當前頁號取得當前頁的起始id
4、用select * from tbl_name where id>=起始id limit 每頁記錄數 取得待顯示記錄
5、列表輸出相關資訊
可以看到,在後一次查詢中。由於利用了id作為主鍵的特徵,資料庫可直接定位到所需記錄。從而減少了查詢時間。
這個查詢演算法有一個副產品:可以產生一條用於銜接上下頁的重複記錄,也就是各頁間有一條重疊的記錄。當然,去掉他也是很容易的。
以下是測試代碼:
include "mysql_result_all.inc"; // 用於顯示查詢結果的工作函數
$pagesize = 9; // 每頁行數
$type = 1; // =1降序排列
$mode = 0; // =1不重複上頁最後一條記錄
$conn = mysql_connect(); // 串連mysql
mysql_select_db("site"); // 選擇資料庫
// 準備動態修改查詢串
if($type) {
$order = "desc";
$expr = "<=";
}else {
$order = "";
$expr = ">=";
}
if($mode) $pagesize++;
mysql_query("set @v:=-1"); // 定義mysql使用者變數
$rs = mysql_query("select @v:=(@v+1) as xh, id from data HAVING mod(xh,$pagesize)=0 order by id $order");
mysql_result_all($rs); // 檢查各頁分布
echo $pages = mysql_num_rows($rs); // 取得總頁數
if($mode) $pagesize--;
// 測試分頁結果,$i表示顯示頁
for($i=0;$i<$pages;$i++) {
mysql_data_seek($rs,$i); // 移動結果集指標
list($xh,$id) = mysql_fetch_row($rs); // 取得起始id
echo "
[$i] $xh -- $id";
$rs1 = mysql_query("select * from data where id$expr$id order by id $order limit $pagesize");
mysql_result_all($rs1); // 顯示相關結果
}
?>
mysql_result_all.inc
這個函數我貼過多次了,對偵錯工具非常有用的。
function mysql_result_all($result,$format="") {
echo "
"; for($i=0;$i echo "
".mysql_field_name($result,$i)." "; } echo "
"; while($row = mysql_fetch_row($result)) { echo ""; for($i=0;$i echo "
".$row[$i]." "; } echo "
"; } echo "
";
}
?>