select count(*) from `def` where `g`='h'
这样来统计记录总条数,效率会高很多。

解决方案 »

  1.   

    FOUND_ROWS() 
    返回最后一个 SELECT SQL_CALC_FOUND_ROWS ... 命令如果没有以 LIMIT 进行限制结果时将返回记录行数。 
    mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
           WHERE id > 100 LIMIT 10;
    mysql> SELECT FOUND_ROWS();第二个 SELECT 将返回一个数字,它指示前一个没有被 LIMIT 子句限制的 SELECT 将返回多少行记录。注意,如果你使用 SELECT SQL_CALC_FOUND_ROWS ...,MySQL 不得不计算所有的记录行到结果集中。然而,这与你不使用 LIMIT 相比是更快一点的,因为结果集不需要发送到客户端。 SQL_CALC_FOUND_ROWS 从 MySQL 4.0.0 开始可以被使用。 
      

  2.   

    keaizhong(可爱钟)的SQL可以用来第一次检索符合条件的总记录数,然后总记录数可以作为GET参数传递,而不用每次都查询
    每次查询的只是limit ($page-1)*$pagesize ,30;
      

  3.   

    不乖天使,如果只传递总记录数的话是不妥的.因为比如在经常变化的记录中,最好别这么用.
    比如说BBS中.如果是在一个网站内.变化不是很大.或者很长时间才会变化记录.可以这么用.
      

  4.   

    每次运行不带参数的页面时都会重新计算记录数,进行添加或删除操作后转到不带总记录数参数的页面,如果只是进行翻页操作就可以使用这个参数,当然在检索后且翻页前有可能存在有些记录发生变化的情况,但概率是非常小的,即使是论坛也是手动刷新后才会重新计算记录数
    简单的算法 + 较小的系统开销 + 很难感觉出的不便 = 实用的程序
    下面的代码可以作为通常情况下分页的代码:if(isset($_GET['allrecord']) && $_GET['allrecord']!='') //已经进行过记录检索
        $allreocrd=$_GET['allrecord'];
    else  //还未进行过记录检索
    {
        $sql="select count(*) from table where xxx=xxxx";
        $result=mysql_query($sql,$conn);
        $rs=mysql_fetch_array($result);
        $allrecord=$rs['count(*)'];
        mysql_free_result($result);
    }
    $pagesize=30;
    $allpage=ceil($allrecord/$pagesize);
    if(isset($_GET['page']) && $_GET['page']!='')
        $page=$_GET['page'];
    else
        $page=1;
    if($page>$allpage)  //如果页号大于总页数则另其等于总页数(包括总页数等于0)
        $page=$allpage;
    if($page<1)   //如果页号小于1则另其等于1 (此句不能和上句颠倒)
        $page=1;
    $offset=($page-1)*$pagesize;
    $sql="查询语句 limit".$offset.",".$pagesize;
    $result=mysql_query($sql,$conn);<a href="?allrecord=<?=$allrecord?>&page=<?=$page-1?>">上一页</a>
    <a href="?allrecord=<?=$allrecord?>&page=<?=$page+1?>">下一页</a>通常情况下完全可以这样做的,如果需要随时随地计算总记录数,这样对系统开销显然是非常不利的