php+mysql分頁處理的探討

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作為主鍵的特征,數據庫可直接定位到所需記錄。從而減少瞭查詢時間。 這個查詢算法有一個副產品:可以產生一條用於銜接上下頁的重復記錄,也就是各頁間有一條重疊的記錄。當然,去掉他也是很容易的。 以下是測試代碼: <?php 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 = "="; } 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<mysql_num_fields($result);$i++) { echo "

".mysql_field_name($result,$i)."

"; } echo ""; while($row = mysql_fetch_row($result)) { echo ""; for($i=0;$i

發佈留言