当前位置:首页 » 编程语言 » sql多条件查询加分页
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql多条件查询加分页

发布时间: 2022-07-13 08:04:20

Ⅰ 多条件查询和分页

//分页函数
//定义函数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.'">&laquo;上一页</a></li>';
else
$pagenav.='<liclass="disabled">&laquo;上一页</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.'">下一页&raquo;</a></li>';
else
$pagenav.='<liclass="disabled">下一页&raquo;</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 查询要适度,不要用太多,会影响效率;