楼上楼上的,怎么作验证?可以一次性取出所有热门新闻的id,然后存入数组。如下例:
<?
$n=5;
if(!session_is_registered("arr")||count($arr)<($n+2)){
$arr=array(12,34,65,324,56,2,5,7,32,62,84,33,74,23,66,42,45,31,43,111,112,113,114,115);//假设这里为取出的id数组
session_register("arr");
}$m=1;
while($m<$n+1){
$k=rand(0,count($arr));
if($arr[$k]){
$rel[]=$arr[$k];
$arr[$k]=null;
$m++;
}
}
$arr=array_unique($arr);
$arr=array_values($arr);
print_r($rel);
//最后得出的$rel数组就是你当前应该取出的新闻id数组。这样可以避免复杂查询
?>

解决方案 »

  1.   

    我也给一种方法.用随机数的.假设你的热点新闻有1w条,大多数用户看来看去也只是那么不到100条吧.根据这个条件可以把精度降低点,因为用我这个方法会很少的机会出现重复(不过很少人会注意到的啦).方法就是用session_id()来参数一个随机数种子,因为一个用户的session_id是不变的,那么用这个种子产生的随机数序列也是恒定的一个序列.然后根据每次选取这个序列的几个输出就可以了.例子:
    假设有1w条热点新闻的记录,每次随机选取5条,现在为了加快选取速度就每次确定一个随机起点,在这个起点选取连续的5条记录.session_start();
    $sid=session_id(); //取出session_id;
    srand($sid); //生成随机数种子
    if(!$start)
      $start=1; // $start为session变量,储存起点号,每次打开新闻页就把$start+1.for($i=1;$i<=$start-1;$i++)
      rand(1,2000); 
    //因为假设有1w条记录,每次选取连续5条记录,所以只产生1到2000的开始点就可以. 
    //这个循环的作用是产生$start-1个随机序列(这是之前打开新闻页的时候产生的随机序列)$startRec=rand(1,2000); //取出这次的开始点.$sql="select * from table where hotnews=1 order by id desc limit $startRec,5";
    $result=mysql_query($sql);
    ...... //处理,输出这五条热点新闻.$start++;
    session_register("start");//把开始点次数加1,以便下次产生不同的开始点.
      

  2.   

    那就也没所谓阿.反正思路的关键是取出一个固定的随机序列而已.那我不取连续的5条,那可以生成一个1-1w的随机序列.然后从中间按照某种算法取出5条记录(这种算法我能保证取出的5条记录每次不同就行).
    反正这些不是关键嘛.不过这样做效率肯定低了很多咯.:>>比如(没具体试过啦,看思路就是):
    session_start();
    $sid=session_id();
    srand($sid); if(!$start)
      $start=1; for($i=1;$i<=5*($start-1);$i++)
      rand(1,10000); for($i=1;$i<=5;$i++){  //循环5次,一次产生5个随机数.然后取出这5条记录
      $startRec=rand(1,10000);
      $sql="select * from table where hotnews=1 order by id desc limit $startRec,1";
      $result=mysql_query($sql);
      ...... //处理,输出1条热点新闻.
    }
    $start++;
    session_register("start");
      

  3.   

    选把你的新闻id生成一个数组,每次再用随机数从数组逐个取出5个ID,生成ID字符串往用户的SESSION上的ID字符串上加,再判断是否在SESSION的字符串里,符合条件的5个就用在SQL语句上.
      

  4.   

    not sure if this will help you, but try something like
    SELECT * FROM YourTable ORDER BY RAND() LIMIT 0,5also see
    http://www.bitbybit.dk/mysqlfaq/addnote.html?ch=ch7_21_0
      

  5.   

    http://www.blueidea.com/bbs/archivecontent.asp?id=359132
      

  6.   

    昨天来过,csdn打不开,今天才看到你们,谢谢了,成功后,当然会给你们加分的!
      

  7.   

    对,的确saucer(思归) 的方法是最好的,mysql参考手册中也有同样的应运“你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。 ”
      

  8.   

    思归的方法我也想到,不过我觉得会重复的几率大很多。因为在mysql里面用rand()没有一个种子,所以每次产生的随机数列都是不同的,那么一个客户浏览那些新闻,每浏览一次程序用rand()就会产生一个新的随机数列。那么就会出现以下的问题:比如第一次产生随机数列:
    0.1,.53,.23,.65,.10,.89,.12,.55.... (当然mysql的rand()产生数列的位数多很多位)
    第二次
    0.32,0.11,0.24,0.76,0.1,0.99,0.78.....那么0.1这个随机数是相同的。
    而用我的那个方法,每个用户拥有一个稳定的随机数列:
    比如:
    6,334,233,76,346,23,87,1002,3233,6323,656.......
    我按顺序取这个数列的值,在取值数量<<随机数范围的情况下,数字几乎不会重复。不信大家可以试试用程序验证一下。数字重复的几率我这个方法肯定少很多.