排序的列不是唯一值的時候如何分頁獲取?

aill發表於2006-06-05
資料庫是SQL Server2000
當排序值是唯一值,就是按照順序遞增的時候比較好辦
例如,按照datetime排序

//page:第幾頁,從第一頁開始
    //pageSize:每頁多少資料
 public Vector getMsgAsPage(int page, int pageSize) {
 Vector rs = null;
    String sql = "";
    if (page == 1) {
      //當獲取第一頁記錄的時候不能使用下面的SQL語句
      sql = "select top  " + pageSize +
          " * from info  order by datetime DESC";
    }
    else {
      sql = "SELECT TOP " + pageSize +
          " * FROM info  WHERE (datetime <(SELECT MIN(datetime ) FROM " +
          "(SELECT TOP " + (page - 1) * pageSize +
          " datetime FROM info  ORDER BY datetime DESC) AS TempTable))  " +
          " ORDER BY datetime DESC";
    }

}
...................
<p class="indent">

上面這種演算法是先獲取前一頁的最小值,然後獲取比最小值還小的所有資料,然後獲取前n個,就是當前頁的資料;

這種演算法要求排序值必須遞增/遞減

但是有些資訊的排序值有可能相等,例如商品的價格;要按照商品價格排序就不能利用上面的演算法了;
我現在是用最笨的辦法;

//page:第幾頁,從第一頁開始
    //pageSize:每頁多少資料
 public Vector getProduceAsPage(int page, int pageSize) {
    Vector rs = null;
    String sql = "";
          sql = "select top  " + pageSize*pageSize +
          " * from info  order by datetime DESC";
   
}
    conn = ds.getConnection(dbsource, dburl, username, password);
       stmt = conn.createStatement();
       ResultSet result = stmt.executeQuery(sql);
       int t=0
       while (result.next()) {
       if(t>=pageSize*(page-1)){
         ProduceDTO p=new ProduceDTO();
         p.setId(result.getString("id"));
         ....
         rs.add(p);
       }       
       t++
       }
...................
<p class="indent">

上面這種演算法是先獲取前N頁的所有資料,把前N-1也的資料排除掉
這種演算法在資料量比較少的時候還可以用
但是當資料量非常大的時候,例如有100W條的時候,要獲取最後一頁,那麼while要迴圈差不多100W次,這樣肯定不行的!

請各位jdon的朋友指點一下,謝謝

相關文章