是没看懂你说什么,其实只要计算好当前页显示的第一条数据row number、和每页最多显示的行数($rowsperpage),以及所有符合条件的数据的总行数,就可以了。
比如,直接 goto 到N页,就算出第N页应该从哪条数据开始显示($rows),然后"SELECT *.........  limit $rows,$rowsperpage", 再把结果集逐条显示出来。看这个文章最后有个例子可以下载看看吧
http://www.phpe.net/articles/382.shtml

解决方案 »

  1.   

    TO 唠叨
    limit 效率不行,我有80W条记录 
    limit $rows,$rowsperpage,这种做法,我一直是这么做的
    现在数据大了,效率不行
      

  2.   

    select * from guestbook where viewmode == 'show' limit n,m
    这种办法显然不行,撞上大量cover记录会翻到全空白的页LZ是否弄错了?
    where view='show',而不是=='show'
    即便是你在贴的时候笔误了,该SQL语句也是实现说把符合记录为show值的查询出来,然后再取结果集合的[N,M]。
    你先把那个问题解决了吧。后面的那一大段程序就没看了,不好意思!
      

  3.   

    limit 效率不行,我有80W条记录。80万的记录不算是多的。请问你给viewmode设置索引了吗?
      

  4.   

    to set zalvsa(水米)
     ('show','cover') 才两种可能,mysql 没有postgresql那种类别索引
      

  5.   

    代码本身垃圾,不要怪mysql效率差。$rowsperpage = 50;
    $query = "SELECT COUNT(*) FROM guestbook WHERE viewmode='show'";
    $result = mysql_query($query);
    $count = mysql_fetch_row($result);$totalpage = ceil($count[0]/$rowsperpage);
    if ($page > $totalpage) $page = $totalpage;
    if ($page < 0) $page = 1;$query = "SELECT * FROM guestbook WHERE viewmode='show' LIMIT ". 
    ($page-1) * $rowsperpage ", $rowsperpage";
    $result = mysql_query($query);
    while ( $row = mysql_fetch_array($result))
    {
    $data[] = $row;
    }这么简单的逻辑怎么被你写成这样?
      

  6.   

    mysql 的 limit[n,m] 当n很大时就会类似全表查询了。lz的意思应该是这个意思吧,呵呵。呵呵,没有能做到完美的,
    用id做限制条件吧。会快
      

  7.   

    跟n没什么关系,mysql不是把所有都查出来,然后选择其中几条,数据库系统没那么笨,都是优化的,
    除非n溢出
      

  8.   

    rowsperpage = 50;
    $query = "SELECT COUNT(*) FROM guestbook WHERE viewmode='show'";
    $result = mysql_query($query);
    $count = mysql_fetch_row($result);$totalpage = ceil($count[0]/$rowsperpage);
    if ($page > $totalpage) $page = $totalpage;
    if ($page < 0) $page = 1;$query = "SELECT * FROM guestbook WHERE viewmode='show' LIMIT ". 
    ($page-1) * $rowsperpage ", $rowsperpage";
    $result = mysql_query($query);
    while ( $row = mysql_fetch_array($result))
    {
    $data[] = $row;
    }
    正解!!!!速度的快慢主要是生成临时表的大小及多少,如果生成临时表有80W条,你只拣其中的10条来用,铁打的服务器也受不了这样的折腾!!!!
    如果你用10条就生成10条,这下应该轻松不少吧。用LIMIT分页后临时生成的表很小,效率很高。简单明了,思路清晰,好程序!!楼主的代码有问题,让人看不懂,要正确应用SQL内嵌函数。
      

  9.   

    to Meteorlet(www.dictworld.com) :
    你的说法就不讨论了,自己回去随便建张表,导入10万数据,然后尝试
    select * from table_name limit 0,30;
    select * from table_name limit 90000,30;带上查询条件的就更不用说了,
    关键是满足搜索条件的结果集有多大,limit从什么位置开始。
    to  axolo(七月十五) :
    不知所谓,也许是自定义的名词别人看不懂,呵呵。
    也或许说的不是一回事,呵呵
      

  10.   

    再说详细一点吧,对于实际应用中,我们可能会如此写:
    对于第n页,(每页m条记录):
    SELECT xxx FROM table_name WHERE where_definition LIMIT (n-1)*m, m;这样的查询实际上是把符合where_definition的结果前n*m个都遍历后,输出最后m条。
    为了解决这个问题,我们采用缩小结果集的办法来实现。不难看出,第一页的语句:
    SELECT xxx FROM table_name WHERE where_definition 0, m;
    这是没有浪费的查询。
    那么我们可以记录下这其中最大的流水号(假定结果按照流水号顺序排列)--maxId1,把这个值传给下一页。那么下一页的查询语句就是
    SELECT xxx FROM table_name WHERE where_definition and id>maxId1 0, m;
    结果集大小仍然只有m(因为查出前m个,就不再继续查了。)同理第n页就是
    SELECT xxx FROM table_name WHERE where_definition and id>maxIdn 0, m;可以看看现在很多论坛什么的,它们现在没有了任意页跳转的功能,为什么?就是因为这个。在很多论坛里你会看到类似这样的翻页:首个10页 前一个10页 1 2 3 4 5 6 7 8 9 10 后一个10页 最后一个10页  
    原理都是一样的。数据库不是万能的,不是你怎么玩都行的,
    不是说数据库不行,是要你怎样合理的利用它。