posts - 5, comments - 2, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2010年3月28日

limit 一般用于经常要返回前几条或者中间某几行数据的查询语句语句中,具体格式如下:
SELECT * FROM table  LIMIT [offset,] rows | rows OFFSET offset
LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)
 举例说明:
     mysql> SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15

//为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: 
mysql
> SELECT * FROM table LIMIT 95,-1// 检索记录行 96-last.

//如果只给定一个参数,它表示返回最大的记录行数目: 
mysql
> SELECT * FROM table LIMIT 5;     //检索前 5 个记录行

//换句话说,LIMIT n 等价于 LIMIT 0,n。

而如果想要实现从数据库的最后一条倒序读出固定的信息条数,则可用:
select * from tablename where(后加条件) order by (条件) desc limit (固定条数) ;
例如:如果想从表hello中读出10条以id形式排列的classID数为0的信息。可写为:
select * from hello where classID=0 order by id desc limit 10;
在sql语句中,limit的功能很强大,使用的地方很多,所以要多注意,使用它能够很大的节省代码数,让代码看起来简洁明了

posted @ 2010-03-29 13:40 赵春平 阅读(689) | 评论 (0)编辑 收藏

今天在网上查找信息的时候看的这个帖子,我相信以后他会给我很大的帮助,所以我将有用的都留了下来,希望可以对自己和大家都有一定的帮助。这里有两个方法:
第一种:(ASP分页显示)
 一、将数据库中所有符合查询条件的记录一次性的都读入   recordset   中,存放在内存中,然后通过   ADO   Recordset   对象所提供的几个专门支持分页处理的属性:   PageSize(   页大小   )、   PageCount(   页数目   )   以及AbsolutePage(   绝对页   )   来管理分页处理。  
  二、根据客户的指示,每次分别从符合查询条件的记录中将规定数目的记录数读取出来并显示。  
  两者的主要差别在于前者是一次性将所有记录都读入内存然后再根据指示来依次做判断分析从而达到分页显示的效果,而后者是先根据指示做出判断并将规定数目的符合查询条件的记录读入内存,从而直接达到分页显示的功能。  
  我们可以很明显的感觉到,当数据库中的记录数达到上万或更多时,第一种方法的执行效率将明显低于第二种方法,因为当每一个客户查询页面时都要将所有符合条件的记录存放在服务器内存中,然后在进行分页等处理,如果同时有超过   100   个的客户在线查询,那么   ASP   应用程序的执行效率将大受影响。但是,当服务器上数据库的记录数以及同时在线的人数并不是很多时,两者在执行效率上是相差无几的,此时一般就采用第一种方法,因为第一种方法的   ASP   程序编写相对第二种方法要简单明了得多。  
  在这里作者就以我们常见的   ASP   BBS   程序为例,来给大家分析一下如何在   BBS   程序里实现分页显示功能,由于我们一般使用的   BBS   程序的数据库记录数和同时访问的人数都不会太多,所以以下程序实例是使用的先前所介绍的第一种分页显示方法。  
  进行   ADO   存取数据库时的分页显示,其实就是对   Recordset   的记录进行操作。所以我们首先必须了解   Reordset   对象的属性和方法:  
  BOF   属性:目前指标指到   RecordSet   的第一笔;  
  EOF   属性:目前指标指到   RecordSet   的最后一笔;    
  Move   方法:移动指标到   RecordSet   中的某一条记录;  
  AbsolutePage   属性:设定当前记录的位置是位于哪一页;  
  AbsolutePosition   属性:目前指标在   RecordSet   中的位置;  
  PageCount   属性:显示   Recordset   对象包括多少“页”的数据;    
  PageSize   属性:显示   Recordset   对象每一页显示的记录数;  
  RecordCount   属性:显示   Recordset   对象记录的总数。  
   
  下面让我们来详细认识一下这些重要的属性和方法  
  一、BOF与EOF属性  
  通常我们在ASP程序中编写代码来检验BOF与EOF属性,从而得知目前指标所指向的   RecordSet的位置,使用BOF与EOF属性,可以得知一个   Recordset   对象是否包含有记录或者得知移动记录行是否已经超出该Recordset   对象的范围。  
  如:   <   %   if   not   rs.eof   then   ...   %>    
  <   %   if   not   (rs.bof   and   rs.eof)   %>    
  若当前记录的位置是在一个   Recordset   对象第一行记录之前时,   BOF属性返回   true,反之则返回   false。  
  若当前记录的位置是在一个   Recordset   对象最后一行记录之后时,   EOF   属性返回   true,反之则返回   false。  
  BOF与EOF都为False:表示指标位于   RecordSet   的当中。  
  BOF为   True:目前指标指到   RecordSet   的第一笔记录。  
  EOF为   True:目前指标指到   RecordSet   的最后一笔记录。  
  BOF与   EOF   都为   True:在   RecordSet   里没有任何记录。  
   
  二、   Move   方法  
  您可以用   Move   方法移动指标到   RecordSet   中的某一笔记录,语法如下:  
  rs.Move   NumRecords,Start  
  这里的“rs”为一个对象变量,表示一个想要移动当当前记录位置的Recordset   对象;“NumRecords”是一个正负数运算式,设定当前记录位置的移动数目;“start”是一个可选的项目,用来指定记录起始的标签。  
  所有的   Recordset   对象都支持   Move   方法,如果   NumRecords   参数大于零,当前记录位置向末尾的方向移动;如果其小于零,则当前记录位置向开头的方向移动;如果一个空的   Recordset   对象调用   Move   方法,将会产生一个错误。  
  MoveFirst   方法:将当前记录位置移至第一笔记录。  
  MoveLast   方法:将当前记录位置移至最后一笔记录。  
  MoveNext   方法:将当前记录位置移至下一笔记录。  
  MovePrevious   方法:将当前记录位置移至上一笔记录。  
  Move   [n]   方法:移动指标到第   n   笔记录,   n   由   0   算起。  
   
  三、   AbsolutePage   属性    
  AbsolutePage   属性设定当前记录的位置是位于哪一页的页数编号;  
  使用   PageSize   属性将   Recordset   对象分割为逻辑上的页数,每一页的记录数为   PageSize(   除了最后一页可能会有少于   PageSize   的记录数   )。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。  
  与   AbsolutePosition   属性相同,   AbsolutePage   属性是以   1   为起始的,若当前记录为   Recordset   的第一行记录,   AbsolutePage   为   1。可以设定   AbsolutePage   属性,以移动到一个指定页的第一行记录位置。  
   
  四、   AbsolutePosition   属性  
  若您需要确定目前指标在   RecordSet   中的位置,您可以用AbsolutePosition   属性。  
  AbsolutePosition   属性的数值为目前指标相对於第一笔的位置,由1算起,即第一笔的   AbsolutePosition   为   1。  
  注意   ,   在存取   RecordSet   时,无法保证   RecordSet   每次都以同样的顺序出现。  
  若要启用   AbsolutePosition,必须先设定为使用用户端cursor(   指针   ),   asp   码如下:  
  rs2.CursorLocation   =   3    
   
  五、   PageCount   属性  
  使用   PageCount   属性,决定   Recordset   对象包括多少“页”的数据。这里的“页”是数据记录的集合,大小等于   PageSize   属性的设定,即使最后一页的记录数比   PageSize   的值少,最后一页也算是   PageCount   的一页。必须注意也并不是所有的数据提供者都支持此项属性。  
   
  六、   PageSize   属性  
  PageSize   属性是决定   ADO   存取数据库时如何分页显示的关键,使用它就可以决定多少记录组成一个逻辑上的“一页”。设定并建立一个页的大小,从而允许使用   AbsolutePage   属性移到其它逻辑页的第一条记录。  
  PageSize   属性能随时被设定。  
   
  七、   RecordCount   属性  
  这也是一个非常常用和重要的属性,我们常用   RecordCount   属性来找出一个   Recordset   对象包括多少条记录。如:  
  <   %   totle=RS.RecordCount   %>    
  在了解了   Recordset   对象的以上属性和方法后,我们来考虑一下,如何运用它们来达到我们分页显示的目的。首先,我们可以为   PageSize   属性设置一个值,从而指定从记录组中取出的构成一个页的行数;然后通过RecordCount   属性来确定记录的总数;再用记录总数除以   PageSize   就可得到所显示的页面总数;最后通过   AbsolutePage   属性就能完成对指定页的访问。





第二种:

比如建立这样一个简单的   BBS   应用程序,它的数据库中分别有以下五个字段:“ID”,每个帖子的自动编号;“subject”,每个帖子的主题;  
  “name”,加帖用户的姓名;“email”,用户的电子邮件地址;  
  “postdate”,加帖的时间。数据库的   DSN   为“bbs”。我们将显示帖子分页的所有步骤放在一个名为“ShowList()”的过程中,方便调用。  
  程序如下:  
  '----BBS   显示帖子分页----  
  <   %   Sub   ShowList()   %>    
  <   %    
  PgSz=20   '设定开关,指定每一页所显示的帖子数目,默认为20帖一页    
  Set   Conn   =   Server.CreateObject("ADODB.Connection")    
  Set   RS   =   Server.CreateObject("ADODB.RecordSet")    
  sql   =   "SELECT   *   FROM   message   order   by   ID   DESC"    
  '查询所有帖子,并按帖子的ID倒序排列  
  Conn.Open   "bbs"    
  RS.open   sql,Conn,1,1  
  If   RS.RecordCount=0   then    
  response.write   "<   P><   center>对不起,数据库中没有相关信息!  
  <   /center><   /P>"    
  else    
  RS.PageSize   =   Cint(PgSz)   '设定PageSize属性的值  
  Total=INT(RS.recordcount   /   PgSz   *   -1)*-1   '计算可显示页面的总数    
  PageNo=Request("pageno")    
  if   PageNo=""   Then    
  PageNo   =   1    
  else    
  PageNo=PageNo+1  
  PageNo=PageNo-1    
  end   if    
  ScrollAction   =   Request("ScrollAction")    
  if   ScrollAction   =   "   上一页   "   Then    
  PageNo=PageNo-1    
  end   if  
  if   ScrollAction   =   "   下一页   "   Then    
  PageNo=PageNo+1    
  end   if    
  if   PageNo   <   1   Then  
  PageNo   =   1    
  end   if  
  n=1  
  RS.AbsolutePage   =   PageNo  
  Response.Write   "<   CENTER>"  
  position=RS.PageSize×PageNo    
  pagebegin=position-RS.PageSize+1    
  if   position   <   RS.RecordCount   then    
  pagend=position    
  else  
  pagend=   RS.RecordCount    
  end   if  
  Response.Write   "<   P><   font   color='Navy'><   B>数据库查询结果:<   /B>"    
  Response.Write   "(共有"&RS.RecordCount   &"条符合条件的信息,    
  显示"&pagebegin&"-"&pagend&")<   /font><   /p>"    
  Response.Write   "<   TABLE   WIDTH=600   BORDER=1   CELLPADDING=4    
  CELLSPACING=0   BGCOLOR=#FFFFFF>"    
  Response.Write   "<   TR   BGCOLOR=#5FB5E2><   FONT   SIZE=2><   TD>    
  <   B>主题<   /B><   /TD><   TD><   B>用户<   /B><   /TD><   TD><   B>Email<   /B>    
  <   /TD><   TD><   B>发布日期<   /B><   /TD><   /FONT><   TR   BGCOLOR=#FFFFFF>"    
  Do   while   not   (RS   is   nothing)    
  RowCount   =   RS.PageSize    
  Do   While   Not   RS.EOF   and   rowcount   >   0    
  If   n=1   then    
  Response.Write   "<   TR   BGCOLOR=#FFFFFF>"    
  ELSE    
  Response.Write   "<   TR   BGCOLOR=#EEEEEE>"    
  End   If    
  n=1-n   %>  
  <   TD><   span   style="font-size:9pt">    
  <   A   href='view.asp?key=<   %   =RS("ID")%>'><   %   =RS("subject")%>    
  <   /A><   /span><   /td>    
  <   TD><   span   style="font-size:9pt">    
  <   %   =RS("name")%><   /A><   /span><   /td>    
  <   TD><   span   style="font-size:9pt">    
  <   a   href="mailto:<   %   =RS("email")%>"><   %   =RS("email")%><   /a>    
  <   /span>   <   /TD>    
  <   TD><   span   style="font-size:9pt">    
  <   %   =RS("postdate")%><   /span>   <   /td>    
  <   /TR>  
  <   %    
  RowCount   =   RowCount   -   1    
  RS.MoveNext    
  Loop    
  set   RS   =   RS.NextRecordSet    
  Loop    
  Conn.Close  
  set   rs   =   nothing    
  set   Conn   =   nothing    
  %>    
  <   /TABLE>    
  <   FORM   METHOD=GET   ACTION="list.asp">    
  <   INPUT   TYPE="HIDDEN"   NAME="pageno"   VALUE="<   %   =PageNo   %>">    
  <   %    
  if   PageNo   >   1   Then  
  response.write   "<   INPUT   TYPE=SUBMIT   NAME='ScrollAction'    
  VALUE='   上一页   '>"    
  end   if    
  if   RowCount   =   0   and   PageNo   <   >Total   then    
  response.write   "<   INPUT   TYPE=SUBMIT   NAME='ScrollAction'    
  VALUE='   下一页   '>"    
  end   if  
  response.write   "<   /FORM>"    
  End   if    
  %>    
  <   %   End   Sub   %>    
   
  相信大家都应该能完全读懂上面的程序,因此就不在此详细解释了。值得注意的是在这段程序中运用了一个小技巧   <   INPUT   TYPE="HIDDEN"   NAME="pageno"   VALUE="<   %   =PageNo   %>">,这是用来在每次调用该ASP   文件时传递数据的“暗道”,由于我们需要在每次调用程序时传递代表当前页码的参数,可能大家会想到使用   session,但是从节省系统资源和通用性来讲,用这样一个隐藏的   form   来传递数据将会达到更好的效果。   
    
 

posted @ 2010-03-28 21:10 赵春平 阅读(1406) | 评论 (0)编辑 收藏