分頁查詢的三種思路

2021-10-09 12:27:16 字數 3767 閱讀 2641

在開發過程中,經常做的一件事,也是最基本的事,就是從資料庫中查詢資料,然後在客戶端顯示出來。當資料少時,可以在乙個頁面內顯示完成。然而,如果查詢記錄是幾百條、上千條呢?直接乙個頁面顯示完全的話,**得多長啊。。。。。。這時,我們可以用分頁技術。

何為分頁?效果圖如下:

這裡總共查詢了100條記錄,如果一次性顯示的話**會很多行,使用者體驗不佳。而我們採用分頁顯示的話,一頁顯示10條記錄,共十頁。使用者可以自行翻閱,記錄少,清晰顯示。

下面談談分頁效果的實現,思路有三種:

其一:純js實現分頁。一次性查詢記錄並載入到html的table中。然後通過選擇性地顯示某些行來達到分頁顯示的目的。這是一種偽分頁,障眼法而已。只能用於資料少的情況下。一旦資料多了,十幾萬條資料載入到html中會變得很慢。而且不實時,一次載入完後資料就寫死在頁面了,若資料庫中有變化,瀏覽器端顯示的仍是上次載入過來的資料。

首先:用table來顯示查詢出來的記錄們,全部顯示。

複製**

<% string user_id, user_name, user_***, user_phone, user_age; while (sqlrst.next()) %>

<%=user_id%>

<%=user_name%>

<%=user_***%>

<%=user_phone%>

<%=user_age%>

複製**

然後,在js中修改table中某些行顯示,某些行隱藏。

複製**

複製**

其二:一次查詢,分批顯示。
複製**

<%

int intpagesize = 10; //一頁顯示的記錄數

int introwcount; //記錄總數

int intpagecount; //總頁數

string strpage; //從表單或url傳送的待顯示頁碼

int intpage; //待顯示頁碼 ,由strpage轉換成的整數

複製**

//—計算記錄總數的第一種方法:查詢出所有記錄,移動結果集指標到最後一條,獲取最後一條記錄的行號

//查詢所有資料

resultset sqlrst = sqlstmt.executequery(「select * from user」);

//獲取記錄總數

sqlrst.last(); //游標在最後一行

introwcount = sqlrst.getrow(); //獲得當前行號,即總記錄數

//記算總頁數

intpagecount = (int)math.ceil(introwcount/(intpagesize*1.0));

複製**

//將記錄指標定位到待顯示頁的第一條記錄上

sqlrst.absolute((intpage - 1) * intpagesize + 1);

//顯示資料

int i=0;

string user_id, user_name, user_***, user_phone, user_age;

while (i < intpagesize && !sqlrst.isafterlast())

%>

複製**

其三:在服務端分頁。跳到第n頁才查詢、顯示第n頁內容。要點就是根據客戶端**的「頁面」計算出資料庫要查詢的當前頁面的第一條記錄的位置。優點:實時性:跳頁才查詢。資料量小:只載入當前頁的記錄進行顯示。

重點在於兩條語句:select count(*) from ...:查詢得到記錄總條數

select * from .. limit pageno,rowscount:查詢從第pageno條開始的rowscount條資料。

複製**

int pages=0; //待顯示頁面

int count=0; //總條數

int totalpages=0; //總頁數

int limit=10; //每頁顯示記錄條數

//計算記錄總數的第二種辦法:使用mysql的聚集函式count()

resultset sqlrst = sqlstmt.executequery("select count() from user");

if(sqlrst.next())

//由記錄總數除以每頁記錄數得出總頁數

totalpages = (int)math.ceil(count/(limit1.0));

//獲取跳頁時傳進來的當前頁面引數

string strpage = request.getparameter(「pages」);

//判斷當前頁面引數的合法性並處理非法頁號(為空則顯示第一頁,小於0則顯示第一頁,大於總頁數則顯示最後一頁)

if (strpage == null) else catch(exception e)

if (pages < 1)

if (pages > totalpages)

}//由(pages-1)*limit算出當前頁面第一條記錄,由limit查詢limit條記錄。則得出當前頁面的記錄

sqlrst = sqlstmt.executequery("select * from user order by user_id limit " + (pages - 1) * limit + "," + limit);

while (sqlrst.next())

複製**

跳頁的實現:跳頁是通過重定向來實現的,通過向當前網頁傳進待顯示的pages,在跳轉後根據pages重新算出頁面顯示的第一條,查limit條顯示。

複製**

第<%=pages%>頁 共<%=totalpages%>頁 首頁

">最後一頁

轉到第:頁

複製**

附:常見資料庫分頁查詢語句

複製**

1.oracle資料庫分頁

select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow

2.db2資料庫分頁

select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by列名) as a) where rc between startrow and endrow

3.sql server 2000資料庫分頁

select top pagesize * from 表名 where 列名 not in(select top pagesize*page 列名 from 表名 order by列名) order by列名

4.sql server 2005資料庫分頁

select * from (select 列名,row_number() over(order by 列名1) as 別名from 表名) as t where t.列名1>=startrow and t.列名1<=endrow

5.mysql資料庫分頁

select * from 表名 limit startrow,pagesize

(pagesize為每頁顯示的記錄條數)

6.postgresql資料庫分頁

select * from 表名 limit pagesize,offset startrow

(pagesize為每頁顯示的記錄條數)

複製**

Web分頁顯示內容之分頁查詢的三種思路(三)

其三 在服務端分頁。跳到第n頁才查詢 顯示第n頁內容。要點就是根據客戶端 的 頁面 計算出資料庫要查詢的當前頁面的第一條記錄的位置。優點 實時性 跳頁才查詢。資料量小 只載入當前頁的記錄進行顯示。重點在於兩條語句 select count from 查詢得到記錄總條數 select from lim...

Oracle的三種分頁查詢

oracle的分頁一共有三種方式 1.根據rowid來分 select from t xiaoxi where rowid in select rid from select rownum rn,rid from select rowid rid,cid from t xiaoxi order by...

Oracle分頁查詢三種方式

1.根據rowid來分 select from t xiaoxi where rowid in select rid from select rownum rn,rid from select rowid rid,cid from t xiaoxi order by cid desc where r...