Ⅰ 多條件查詢和分頁
//分頁函數
//定義函數pageft(),三個參數的含義為:
//$totle:信息總數;
//$displaypg:每頁顯示信息數,這里設置為默認是20;
//$url:分頁導航中的鏈接,除了加入不同的查詢信息「page」外的部分都與這個URL相同。
//默認值本該設為本頁URL(即$_SERVER["REQUEST_URI"]),但設置默認值的右邊只能為常量,所以該默認值設為空字元串,在函數內部再設置為本頁URL。
functionpageft($totle,$displaypg=20,$url='',$shownum=1,$showtext=1,$showselect=0,$showlvtao=7){
if(empty($totle)){
returnfalse;
}
$page=isset($_GET['page'])?intval($_GET['page']):1;
$url.='/page/';
//頁碼計算:
$lastpg=ceil($totle/$displaypg);//最後頁,也是總頁數
$page=min($lastpg,$page);
$prepg=$page-1;//上一頁
$nextpg=($page==$lastpg?0:$page+1);//下一頁
$firstcount=($page-1)*$displaypg;
//開始分頁導航條代碼:
if($showtext==1){
$pagenav='<divclass="results"><span>第'.($totle?($firstcount+1):0).'-'.min($firstcount+$displaypg,$totle).'條共'.$totle.'</span></div><div><ulclass="pager">';
}else{
$pagenav="";
}
//如果只有一頁則跳出函數:
//if($lastpg<=1)
//returnfalse;
if($prepg)
$pagenav.='<li><ahref="'.$url.$prepg.'">«上一頁</a></li>';
else
$pagenav.='<liclass="disabled">«上一頁</li>';
if($shownum==1){
$o=$showlvtao;//中間頁碼表總長度,為奇數
$u=ceil($o/2);//根據$o計算單側頁碼寬度$u
$f=$page-$u;//根據當前頁$currentPage和單側寬度$u計算出第一頁的起始數字
//str_replace('{p}',,$fn)//替換格式
if($f<0){
$f=0;
}//當第一頁小於0時,賦值為0
$n=$lastpg;//總頁數,20頁
if($n<1){
$n=1;
}//當總數小於1時,賦值為1
if($page==1){
$pagenav.='<liclass="current">1</li>';
}else{
$pagenav.='<li><ahref="'.$url.'1">1</a></li>';
}
///////////////////////////////////////
for($i=1;$i<=$o;$i++){
if($n<=1){
break;
}//當總頁數為1時
$c=$f+$i;//從第$c開始累加計算
if($i==1&&$c>2){
$pagenav.='<liclass="separator">...</li>';
}
if($c==1){
continue;
}
if($c==$n){
break;
}
if($c==$page){
$pagenav.='<liclass="current">'.$page.'</li>';
}else{
$pagenav.='<li><ahref="'.$url.$c.'">'.$c.'</a></li>';
}
if($i==$o&&$c<$n-1){
$pagenav.='<liclass="separator">...</li>';
}
if($i>$n){
break;
}//當總頁數小於頁碼表長度時
}
if($page==$n&&$n!=1){
$pagenav.='<liclass="current">'.$n.'</li>';
}else{
if($lastpg>1){
$pagenav.='<li><ahref="'.$url.$n.'">'.$n.'</a></li>';
}
}
}
if($nextpg)
$pagenav.='<li><ahref="'.$url.$nextpg.'">下一頁»</a></li>';
else
$pagenav.='<liclass="disabled">下一頁»</li>';
$pagenav.='</ul></div>';
if($showselect==1){
//下拉跳轉列表,循環列出所有頁碼:
$pagenav.="跳至<selectname='topage'size='1'onchange='window.location="$url"+this.value'> ";
for($i=1;$i<=$lastpg;$i++){
if($i==$page)
$pagenav.="<optionvalue='$i'selected>$i</option> ";
else
$pagenav.="<optionvalue='$i'>$i</option> ";
}
$pagenav.="</select>頁";
}
return$pagenav;
}
//數據查詢頁面
$page=array();
$page['url']=U('Supervise/myefficiencybooklist',array('Status'=>$_GET['Status']));
$page['pagesize']=16;
$page['frmnum']=($pagenum-1)*$page['pagesize'];
$Efficiencybook=M('efficiencybook','app_yhcm_supervise_');
$totle=$Efficiencybook->where('uid='.$this->_G['userid'].$where)->count();
$page['totle']=$totle;
$this->assign('page',$page);//將分頁參數復制給模版變數
{:pageft($page['totle'],$page['pagesize'],$page['url'])}
以上是我一個項目裡面用到的 你適當的改下就能用了
Ⅱ sql server 2000 實現帶條件的分頁查詢sql怎麼寫
select top sum * from 表名 where
id not in (select top sum *(num -1) id from 表名 where 欄位名 > 「變數」 and .... order by ** desc)
and 欄位名 > 「變數」 and .... order by ** desc
子查詢和父查詢都用同樣的where條件和order。
Ⅲ 關於SQL資料庫多條件數據查詢和asp分頁顯示
查詢可以用if else 去做。
例如:
sql="select * from ........."
``````````````
xh=request("型號")
······
if xh<>"" then sql=sql+" and 型號='"&xh&"'"
分頁可以用
<%TurnPage(rs,20,"型號="&xh&"&其他6個參數·······")%>
<%
Sub TurnPage(ByRef Rs_tmp,PageSize,canshu) 'Rs_tmp 記錄集 PageSize 每頁顯示的記錄條數;
Dim TotalPage '總頁數
Dim PageNo '當前顯示的是第幾頁
Dim RecordCount '總記錄條數
Rs_tmp.PageSize = PageSize
RecordCount = Rs_tmp.RecordCount
TotalPage = INT(RecordCount / PageSize * -1)*-1
PageNo = Request.QueryString ("PageNo")
'直接輸入頁數跳轉;
If Request.Form("PageNo")<>"" Then PageNo = Request.Form("PageNo")
'如果沒有選擇第幾頁,則默認顯示第一頁;
If PageNo = "" then PageNo = 1
If RecordCount <> 0 then
Rs_tmp.AbsolutePage = PageNo
End If
'獲取當前文件名,使得每次翻頁都在當前頁面進行;
Dim fileName,postion
fileName = Request.ServerVariables("script_name")
postion = InstrRev(fileName,"/")+1
'取得當前的文件名稱,使翻頁的鏈接指向當前文件;
fileName = Mid(fileName,postion)
response.write "<table border=0 width='100%'><tr> "
If RecordCount = 0 or TotalPage = 1 Then
Response.Write ""
Else
response.write "<td align=left style='font-size:12px'> 總頁數:<font color=#ff3333>"&TotalPage&"</font>頁"
response.write "當前第<font color=#ff3333>"&PageNo&"</font>頁 </td> "
response.write "<td align='right' style='font-size:12px'> "
end if
If RecordCount = 0 or TotalPage = 1 Then
Response.Write ""
Else
response.write "<a href='"&fileName&"?PageNo=1&"&canshu&"'>首頁|</a>"
If PageNo - 1 = 0 Then
Response.Write "前頁|"
Else
response.write "<a href='"&fileName&"?PageNo="&PageNo-1&"&"&canshu&"'>前頁|</a>"
End If
If PageNo+1 > TotalPage Then
Response.Write "後頁|"
Else
response.write "<a href='"&fileName&"?PageNo="&PageNo+1&"&"&canshu&"'>後頁|</a>"
End If
response.write "<a href='"&fileName&"?PageNo="&TotalPage&"&"&canshu&"'>末頁</a>"
End If
response.write "</td></td></tr></table> "
end sub%>
Ⅳ SQL Server 分頁 查詢語句
四種方式實現SQLServer 分頁查詢
SQLServer 的數據分頁:
假設現在有這樣的一張表:
CREATE TABLE test
(
id int primary key not null identity,
names varchar(20)
)
然後向裡面插入大約1000條數據,進行分頁測試
假設頁數是10,現在要拿出第5頁的內容,查詢語句如下:
--10代表分頁的大小
select top 10 *
from test
where id not in
(
--40是這么計算出來的:10*(5-1)
select top 40 id from test order by id
)
order by id
原理:需要拿出資料庫的第5頁,就是40-50條記錄。首先拿出資料庫中的前40條記錄的id值,然後再拿出剩餘部分的前10條元素
第二種方法:
還是以上面的結果為例,採用另外的一種方法
--數據的意思和上面提及的一樣
select top 10 *
from test
where id >
(
select isnull(max(id),0)
from
(
select top 40 id from test order by id
) A
)
order by id
原理:先查詢前40條記錄,然後獲得其最id值,如果id值為null的,那麼就返回0
然後查詢id值大於前40條記錄的最大id值的記錄。
這個查詢有一個條件,就是id必須是int類型的。
第三種方法:
select top 10 *
from
(
select row_number() over(order by id) as rownumber,* from test
) A
where rownumber > 40
原理:先把表中的所有數據都按照一個rowNumber進行排序,然後查詢rownuber大於40的前十條記錄
這種方法和oracle中的一種分頁方式類似,不過只支持2005版本以上的
第四種:
存儲過程查詢
創建存儲過程
alter procere pageDemo
@pageSize int,
@page int
AS
declare @temp int
set @temp=@pageSize*(@page - 1)
begin
select top (select @pageSize) * from test where id not in (select top (select @temp) id from test) order by id
end
執行存儲過程
exec 10,5
Ⅳ SQL如何實現數據分頁,要具體語句,謝謝
可以的,用存儲過程
分頁存儲過程如下
CREATE PROCEDURE GetRecordFromPage
@tblName varchar(255), -- 表名
@RetColumns varchar(1000) = '*', -- 需要返回的列,默認為全部
@Orderfld varchar(255), -- 排序欄位名
@PageSize int = 10, -- 頁尺寸
@PageIndex int = 1, -- 頁碼
@IsCount bit = 0, -- 返回記錄總數, 非 0 值則返回
@OrderType varchar(50) = 'asc', -- 設置排序類型, 非 asc 值則降序
@strWhere varchar(1000) = '' -- 查詢條件 (注意: 不要加 where)
AS
declare @strSQL varchar(1000) -- 主語句
declare @strTmp varchar(300) -- 臨時變數
declare @strOrder varchar(400) -- 排序類型
if @IsCount != 0 --執行總數統計
begin
if @strWhere != ''
set @strSQL = "select count(*) as Total from [" + @tblName + "] where " + @strWhere
else
set @strSQL = "select count(*) as Total from [" + @tblName + "]"
end
else --執行查詢操作
begin
if @OrderType != 'asc'
begin
set @strTmp = "<(select min"
set @strOrder = " order by [" + @Orderfld +"] desc"
end
else
begin
set @strTmp = ">(select max"
set @strOrder = " order by [" + @Orderfld +"] asc"
end
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "] where [" + @Orderfld + "]" + @strTmp + "(["
+ @Orderfld + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @Orderfld + "] from [" + @tblName + "]" + @strOrder + ") as tblTmp)"
+ @strOrder
if @strWhere != ''
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "] where [" + @Orderfld + "]" + @strTmp + "(["
+ @Orderfld + "]) from (select top " + str((@PageIndex-1)*@PageSize) + " ["
+ @Orderfld + "] from [" + @tblName + "] where (" + @strWhere + ") "
+ @strOrder + ") as tblTmp) and (" + @strWhere + ") " + @strOrder
if @PageIndex = 1
begin
set @strTmp = ""
if @strWhere != ''
set @strTmp = " where (" + @strWhere + ")"
set @strSQL = "select top " + str(@PageSize) + " " + @RetColumns + " from ["
+ @tblName + "]" + @strTmp + " " + @strOrder
end
end
exec (@strSQL)
Ⅵ SQL Compact 3.5 下多條件排序分頁查詢該怎麼做
給你一個例子:
declare @page_size int;
declare @page_num int;
--比如:每頁10條記錄
set @page_size = 10;
--比如:先取第1頁
set @page_num = 1;
select *
from
(
select *,
--這里按照@@servername來排序,
--你可以根據需要按照id,sid,sname等欄位來排序
(row_number() over(order by @@servername) - 1) / @page_size as pagenum
from sys.objects
)t
where pagenum = @page_num - 1
Ⅶ SQL語句分頁查詢,一頁面多少數據合適
2萬條。
在SQLServer中通過SQL語句實現分頁查詢,在SQLServer中通過SQL語句實現分頁後插入數據2萬條,用更多的數據測試會明顯一些。微軟的SQLSERVER提供了兩種索引:聚集索引,也稱聚類索引、簇集索引和非聚集索引,也稱非聚類索引、非簇集索引。
建立一個web應用,分頁瀏覽功能必不可少。這個問題是資料庫處理中十分常見的問題。經典的數據分頁方法是:ADO紀錄集分頁法,也就是利用ADO自帶的分頁功能(利用游標)來實現分頁。但這種分頁方法僅適用於較小數據量的情形,因為游標本身有缺點:游標是存放在內存中,很費內存。游標一建立,就將相關的記錄鎖住,直到取消游標。游標提供了對特定集合中逐行掃描的手段,一般使用游標來逐行遍歷數據,根據取出數據條件的不同進行不同的操作。而對於多表和大表中定義的游標(大的數據集合)循環很容易使程序進入一個漫長的等待甚至死機。更重要的是,對於非常大的數據模型而言,分頁檢索時,如果按照傳統的每次都載入整個數據源的方法是非常浪費資源的。現在流行的分頁方法一般是檢索頁面大小的塊區的數據,而非檢索所有的數據,然後單步執行當前行。最早較好地實現這種根據頁面大小和頁碼來提取數據的方法大概就是「俄羅斯存儲過程」。這個存儲過程用了游標,由於游標的局限性,所以這個方法並沒有得到大家的普遍認可,後來,網上有人改造了此存儲過程,實現了分頁儲存。
Ⅷ sql存儲過程定義多條件查詢加分頁
給你一個強大至極的分頁存儲過程(輸入對應的參加即可),以此共勉,希望你也能進步:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[Pagination]
@Page int = 1, -- 當前頁碼
@PageSize int = 10, -- 每頁記錄條數(頁面大小)
@Table nvarchar(500), -- 表名或視圖名,甚至可以是嵌套SQL:(Select * From Tab Where ID>1000) Tab
@Field nvarchar(800) = '*', -- 返回記錄集欄位名,","隔開,默認是"*"
@OrderBy nvarchar(100) = 'ID ASC', -- 排序規則
@Filter nvarchar(500), -- 過濾條件
@MaxPage smallint output, -- 執行結果 -1 error, 0 false, maxpage true
@TotalRow int output, -- 記錄總數 /* 2007-07-12 22:11:00 update */
@Descript varchar(100) output -- 結果描述
AS
BEGIN
-- =============================================
-- Author: Jimmy.Yu
-- Create date: 2007-5-11
-- Description: SQL 2005 以上版本 通用分頁存儲過程
-- =============================================
Set ROWCOUNT @PageSize;
Set @Descript = 'successful';
-------------------參數檢測----------------
IF LEN(RTRIM(LTRIM(@Table))) !> 0
Begin
Set @MaxPage = 0;
Set @Descript = 'table name is empty';
Return;
End
IF LEN(RTRIM(LTRIM(@OrderBy))) !> 0
Begin
Set @MaxPage = 0;
Set @Descript = 'order is empty';
Return;
End
IF ISNULL(@PageSize,0) <= 0
Begin
Set @MaxPage = 0;
Set @Descript = 'page size error';
Return;
End
IF ISNULL(@Page,0) <= 0
Begin
Set @MaxPage = 0;
Set @Descript = 'page error';
Return;
End
-------------------檢測結束----------------
Begin Try
-- 整合SQL
Declare @SQL nvarchar(4000), @Portion nvarchar(4000);
Set @Portion = ' ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ') AS ROWNUM FROM ' + @Table;
Set @Portion = @Portion + (CASE WHEN LEN(@Filter) >= 1 THEN (' Where ' + @Filter + ') AS tab') ELSE (') AS tab') END);
Set @SQL = 'Select TOP(' + CAST(@PageSize AS nvarchar(8)) + ') ' + @Field + ' FROM (Select ' + @Field + ',' + @Portion;
Set @SQL = @SQL + ' Where tab.ROWNUM > ' + CAST((@Page-1)*@PageSize AS nvarchar(8));
-- 執行SQL, 取當前頁記錄集
Execute(@SQL);
--------------------------------------------------------------------
-- 整合SQL
Set @SQL = 'Set @Rows = (Select MAX(ROWNUM) FROM (Select' + @Portion + ')';
-- 執行SQL, 取最大頁碼
Execute sp_executesql @SQL, N'@Rows int output', @TotalRow output;
Set @MaxPage = (CASE WHEN (@TotalRow % @PageSize)<>0 THEN (@TotalRow / @PageSize + 1) ELSE (@TotalRow / @PageSize) END);
End Try
Begin Catch
-- 捕捉錯誤
Set @MaxPage = -1;
Set @Descript = 'error line: ' + CAST(ERROR_LINE() AS varchar(8)) + ', error number: ' + CAST(ERROR_NUMBER() AS varchar(8)) + ', error message: ' + ERROR_MESSAGE();
Return;
End Catch;
-- 執行成功
Return;
END
Ⅸ 怎麼使用sql server 按條件查詢的結果分頁顯示求大神給代碼
盡量不要使用嵌套子查詢,優先使用連接子查詢;
In 關鍵字盡量少使用,效率低,除非 in 包含的信息量非常少,並且叫固定;
如果查詢條件和查詢結果表無直接關聯,優先根據查詢條件查詢出符合條件的臨時結果值,然後和最終結果表關聯;
除 top n 方式分頁之外,使用 row_number() over 方式分頁也可以;
能明確指定結果欄位的,盡量不要用 * ;
不相關的欄位可以省略;
如果最終結果表數據比較大,考慮分表,分區,分庫;
查詢結果表欄位盡量不要包含大文本之類的欄位;
where 條件中對於varchar 欄位 的 like 查詢要適度,不要用太多,會影響效率;