如果是我当然是选择直接对结果进行select xxx limit xx,xx
操作临时表不是多此一举嘛!

解决方案 »

  1.   

    <?php

    $PAGE_ROWS=18;//每页行数
    $CONFIG->query = "select count(username) as total from users"; 
    $result=db_query("select");  $totalrows=$result[0][total];
    $size=$totalrows/$PAGE_ROWS;
    if ($totalpages=="" and $inpage==""){
      $totalpages=ceil($size);
      $inpage="1";
    }
        //·&shy;&Ograve;&sup3;
    $limit=($inpage-1)*$PAGE_ROWS.",".$PAGE_ROWS;
        $CONFIG->query="select * from users order by username desc limit ".$limit;//这就是那条limit语句
    $result=db_query("select");   
        $rows=count($result)-1;
      
    for($i=0;$i<$rows;$i++){
    输出数据
    }<table border="0" bordercolorlight="#ffffff" bordercolordark="#ffffff" width="98%" cellpadding="0" cellspacing="1">
    <tr>
    <td>
    <?phpif (($inpage!=1)&&($totalpages>1))
    echo '<A href="'.$PHP_SELF.'?inpage='.($inpage-1).'&totalpages='.$totalpages.'"><font class="Fnt12px">&lt;&Eacute;&Iuml;&Ograve;&raquo;&Ograve;&sup3;</font></A>&nbsp;';
    else{
    if ($totalpages<=1)
    echo '&nbsp;';
    else
    echo '<font color="#A4A4A4" class="Fnt12px">&lt;&Eacute;&Iuml;&Ograve;&raquo;&Ograve;&sup3;</font>&nbsp;';
    }
    for ($x=1;$x<=$totalpages;$x++)
    {
    if ($x==$inpage) if ($x==1 and $totalpages==1)
       echo '&nbsp';
    else
       echo '<font  class="Fnt12pxR"><B>'.$x.'</B></font>&nbsp;'; 

    else
    echo '<A href="'.$PHP_SELF.'?&inpage='.$x.'&totalpages='.$totalpages.'"><font class="Fnt12px">'.$x.'</font></A></A>&nbsp;';
    }
    if (($inpage!=$totalpages)&&($totalpages>1))
    echo '<A href="'.$PHP_SELF.'?inpage='.($inpage+1).'&totalpages='.$totalpages.'"><font class="Fnt12px">&Iuml;&Acirc;&Ograve;&raquo;&Ograve;&sup3;&gt;</font></A>&nbsp;';
    else{
    if ($totalpages<=1)
    echo '&nbsp;';
    else
    echo '<font color="#A4A4A4" class="Fnt12px">&Iuml;&Acirc;&Ograve;&raquo;&Ograve;&sup3;&gt;</font>&nbsp;';
    }echo '&nbsp;';
    ?>
    </td>
    </tr>
    </table>
      

  2.   

    临时表一个很重要的用法,就是解决多重子查询。可以用临时表来存储中间查询的结果集。你如果用一条sql语句搞不定的话,就可以考虑用临时表。其他情况最好不要用。对于分页,我觉得select xxx limit xx,xx这种方法对于复杂查询也不够好
    因为都要进行两次查询,一次统计记录数量,一次用于limit。这样肯定影响查询速度。这时候用临时表倒是一种方法。对于分页,我觉得下面这种方法最好.还适用于sqlserver
    用mysql_data_seek+mysql_num_rows结合来分页,这点你应该懂吧
      

  3.   

    我这种情况我想了一天了,肯定要用临时表进行操作的.有6个表,每个表的字段不同,要对这6个表进行搜索,然后把搜索结果分页输出.
    如果不用临时表,分页就很麻烦了.
    因为不可能用一条select把6个表的数据选择起来.现在关键是怎样用这个临时表的问题而已.
    到底是用系统自带的临时表还是自己做一个表当临时表用的问题.
      

  4.   

    用union就可以将多个查询结果组合在一起了。这样就可以用一条语句选择多个表了
      

  5.   

    基本上,6个表都有title,body,id三个字段.
    我要搜索这些表的title,body字段,然后搜索出的title和这个文章所使用的url放在临时表中.
    比如:
    tblgeography中搜索到id为: 1,6,10,15...等表,
    在tblhistory中搜索到id为: 2,6,14,15...等表.
    则在临时表中存为:
    title                      url 
    地理文章题目1          geography.php?id=1
    地理文章题目6          geography.php?id=6
    地理文章题目10         geography.php?id=10
    地理文章题目15         geography.php?id=15
    历史文章题目2          history?id=2
    历史文章题目6          history?id=6
    历史文章题目14         history?id=14
    历史文章题目15         history?id=15注意:
    我所说的临时表不一定是用create temporary table xxx所建立的临时表,也可以是一个普通的表,不过用来存放上面的数据.大家看看,如果用create temporary table xxx这种表存放搜索结果(或者用union组合多个查询结果),比如我一次搜索下来在6个表中共搜索出1000条记录,我要每页按20条记录分页显示这些数据,那么如果从第一页开始看到最后一页,对6个表的搜索以及建立这个临时表共要进行50次.因为temporary table在php程序结束后自动被drop.我搜索的东西1000条记录其实只有50条是有用被显示出来的...其中有多浪费大家可以衡量到...所以我想用一个普通的表来存放这些搜索结果,不过要加入些字段来判断这些搜索结果是属于哪次搜索的,比如使用session_id,time()的后6位数字就基本可以唯一标识某个用户的某次搜索的结果.
    用这种方法,只要在搜索开始之前判断某次的搜索是否已经存在,如果是就可以直接用之前搜索的结果,那么按照上面的例子,那1000条记录只要搜索一次并且存入到这个"临时表"中,在按下一页、上一页这种的操作中就不需要再搜索那6个表了。其效率也应该有所提高。当然,在第二种方法中,“临时表”中的记录因为有多个用户同时使用的情况,而且还要不断把无用的搜索记录删除这类操作,所以肯定使用这个表比单单使用temporary table的要慢。而且我的这种关于效率的推断是基于用户对那1000个搜索结果每页都查看过的极限情况下推断出来的,因为在实际用的时候,用户基本不会把1000个搜索结果都看过,可能只会看其中的几页。显然如果用户只看这些搜索结果中的某几页时用temporary table的效率会比用第二种方法中的“临时表”效率要高。
    所以这些东西要用经验去衡量其取舍关系,我想看看有没有人有使用过这类方法,看看他们的经验,比如用户查询到底一般只看几页呢还是一般都会看得比较多页等等。
      

  6.   

    那是不是create + insert + select 会比两次select 快呢?
    关注!!!!!!
      

  7.   

    什么是两次select呢?
    其实一般来说,用insert肯定比select要慢很多。
    我测试过,用temporary table进行insert 200000条记录用了12秒。
    而select这20w条记录要3-5秒.
      

  8.   

    insert肯定快多了你的select语句肯定并不是一次只查询出一条语句
      

  9.   

    测试程序:<?
    mysql_pconnect("localhost","root");
    mysql_select_db("jlong");
    /*
    $sql="drop table searchtmps";
    mysql_query($sql);
    $sql="
    create table searchtmps(
    sid varchar(31) NOT NULL,
    time varchar(10) NOT NULL,
    url VARCHAR(200) NOT NULL, 
    title VARCHAR(150) NOT NULL,
    index(sid,time)
    )";
    $result=mysql_query($sql);
    echo mysql_error()."<BR>";
    */session_start();
    $sid=session_id();
    $t1=time();
    echo $t1."<br>";
    flush;
    $a=$t1%100000;
    for($i=0;$i<=2500;$i++){
    $sql="
    insert into searchtmps
    select '$sid','$a',concat('geography.php?id=',id),title from tblarea order by rand() limit 50
    ";
    mysql_query($sql);
    } // 在tblarea中随机插入200000记录.
    $t2=time();
    echo $t2."<br>";
    echo ($t2-$t1)."<br>";$sql="select count(*) from searchtmps where sid='$sid' and time='$a'";
    $result=mysql_query($sql);
    echo mysql_result($result,0,0)."count time <br>";$sql="select * from searchtmps where sid='$sid' and time='$a'";
    $result=mysql_query($sql);
    $t3=time();
    echo $t3."(search all timimg)<br>";
    echo ($t3-$t2)."<br>";$sql="select * from searchtmps where sid='$sid' and time='$a' limit 10000,50";
    $result=mysql_query($sql);
    $t4=time();
    echo $t4."(search 50recs timimg)<br>";
    echo ($t4-$t3)."<br>";
    ?>具体测试结果是多少我忘记了。
      

  10.   

    那就是用两次select总比建临时表好吧.
    limit......
      

  11.   

    如果数据变化得不快,而且大家的查询很可能是重复的话,还是用一个单独的表好一点吧?可以重用查询结果。这样的话,这个表的key就不要用session id了,用查询的条件作key比较好,不同的用户可以利用同一个查询结果。也不一定要每次清除,到了一定的时间清除一下就可以了。
      

  12.   

    tommy的做法我也想过了,的确自己做一个临时表灵活性大很多。
    目前我是选择了第二种方法先在网站上试用一阵先了。还有一个问题,我现在删除多余数据的方法是用于搜索的时候在搜索前有1%的机会删除time字段离现在超过600秒的数据。大家觉得这样好不好?
    因为我自己测试过刷了N次还没等到这个1%的机会...