最後是SQLCOMMENT這個類的操作了,這裡公布兩個方法的源碼,演算法不是很好,大家有更好的演算法記得告訴我哦!
代碼
public DataSet getAllComments()
{
string strSql = string.Empty;
strSql = "select CommentID,TypeID,FromID,[Name],Contents,PublishDate,IP from tb_Comment ";
return BasicSQLHelper.Query(strSql, null);
}
/// <summary>
/// 根據指定條件輸送資料
/// </summary>
/// <param name="start">開始位置</param>
/// <param name="end">結束位置</param>
/// <param name="orderid">按什麼排序</param>
/// <param name="orderway">排序方式:asc/desc</param>
/// <returns></returns>
public DataSet getCommentsFromTo(int start, int end, string orderid, string orderway, int page)
{
string strSql = string.Empty;
//保證end要比start大
if (start > end)
{
int temp = start;
start = end;
end = temp;
}
strSql = "SELECT TOP " + (end - start + 1) + " * FROM tb_Comment ";
strSql += "WHERE ";
strSql += "( ";
strSql += orderid + " NOT IN ";
strSql += "( ";
if (page == 1)
{
strSql += "SELECT TOP " + (start - 1) + " " + orderid + " FROM tb_Comment ";
}
else
{
strSql += "SELECT TOP " + (start - 2) + " " + orderid + " FROM tb_Comment ";
}
strSql += "order by " + orderid + " " + orderway + " ";
strSql += ") ";
strSql += ") ";
strSql += "order by " + orderid + " " + orderway + " ";
return BasicSQLHelper.Query(strSql, null);
}
最後再貼一個分頁的SQL的代碼,以供大家參考~
所以,一併整理出來。
SQL Server 2005
PageCount:一頁需要的資料條數
PageIndex:頁索引
select top PageCount * from (
select top PageCount * from (
select top PageCount*PageIndex * from tableName order by ID) as tmp1 order by ID DESC
) as tmp2 order by ID
)
解釋一下,比如在論壇中,有100條文章,每一頁顯示20條文章,如果顯示第2頁。則,先按照時間排序,取出前40條記錄,然後40條記錄按照時間反過來排序,取出前20條記錄,再按照時間排序一次,按照正常的順序讀出來。所以,這個分頁是三重top組合排序。
Oracle 10i:
SQL:普通的Select語句
FromIndex:從…條
ToIndex:到…條
通用的方式:
select * from (
select row_.*, rownum rownum_ from (
SQL
) row_ where rownum <= toIndex
) where rownum_ > fromIndex
解釋一下,還是上面的例子,先按照時間順序查詢出來,rownum是查詢結果的序號,如果是第2頁的話,取出第0到40(<=toIndex)條文章。然後取出>20的文章。
有唯一識別碼(ID欄位)的情況排序
select * from tableName where ID in(
select ID from (
select rownum rownum_,ID from (
select ID from tableName order by Code
) where rownum <= toIndex
) where rownum_ > fromIndex
)
=======================================
Mysql的分頁
通用的情況是這樣的:
SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20
文中提到一種”clue”的做法,給翻頁提供一些”線索”,比如還是SELECT * FROM message ORDER BY id DESC,按id降序分頁,每頁20條,當前是第10頁,當前頁條目id最大的是9527,最小的是9500,如果我們只提供”上一頁”、”下一頁”這樣 的跳轉(不提供到第N頁的跳轉),那麼在處理”上一頁”的時候SQL語句可以是:
SELECT * FROM message WHERE id > 9527 ORDER BY id ASC LIMIT 20;
處理”下一頁”的時候SQL語句可以是:
SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 20;
不管翻多少頁,每次查詢只掃描20行。
=====================MySql這段來自超群部落格
我認為這是在原有的分頁基礎上的一個突破。對於SqlServer和Oracle的分頁也很借鑒意義。有條件的可以改寫SqlServer和Oracle的翻頁Sql,加上Where條件。
如果不加條件限制,可以看到越向後翻,效能是越低的,最後一頁就是全表掃描了。如果加上限制,時間幾乎是常數了。
分頁中,索引也非常重要,在索引列上一定需要建索引,避免全表掃描。
總結起來就幾句話:
SqlServer用top,
Oracle用rownum,
MySql用Limit,
排序列建Index,
加上Where條件,
分頁高效能。
OK了,如果大家還有不明白的或者調試不成功,留言吧~