引用——————————————————ashchen(老陳) ( ) 信誉:120 老大,这也太麻烦了吧?如果是数组,随机id,从数据库取,赋到数组就行了,最后检测一下数量,不够数量重复取引用——————————————————你的建议不错,我主要考虑的是每次最大程度上的匹配,也就是尽量让数据库查询到实际内容!会改一下文件的!

解决方案 »

  1.   

    先取id范围,然后随机取n(或者再加一点偏移量)个id, 查询数据,查看记录数量,不够就再随机取id(不重复),再查询,直到取到n条数据为止。
    尽量减少数据库查询, php本身是很快的。
    或者干脆就用存储过程
      

  2.   

    根据上面几个大大的建议下该了!<?phprequire 'system/include/common.inc.php';$n = 10;  //随机显示的记录数
    $results = $result = array();  //记录结果的数组$rowNum = mysql_result(mysql_query("SELECT COUNT(*) AS cnt FROM test"), 0, 0); echo $rowNum;if($rowNum < 50) { //数据量小的话,这样反而可以提高效率,当然50可以随便改

    $query = mysql_query("SELECT * FROM test ORDER BY rand() LIMIT 0,$n");
    while($result = mysql_fetch_array($query)) {
    $results[$result['id']] = $result;
    }

    } else {

    //随机的范围
    $maxNum = mysql_result(mysql_query("SELECT MAX(id) AS maxid FROM test"), 0, 0);
    $minNum = 1;

    //存放记录的数组
    $results = array();

    //存放生成的id,用来判断是否已经出现过!
    $existIds = array();

    //随机的id集合 格式为 xx,xx,xx,xx,用来查询记录
    $limitNum = $randId = $randIds = '';

    //根据已经产生的记录来动态控制下次查询的记录数
    $limitNum = $n;

    do {

    $query = $result = '';

    $randIds = ''; //清除上次查询id

    $comma = '';

    $j = 0;
    while($j < $n) { //while($j < 2 * $n) {   随机产生n个数字,可以增加一定值,来加大命中率

    mt_srand((float)microtime() * 1000000);
    $randId = mt_rand($minNum, $maxNum);

    if(!in_array($randId, $existIds)) {
    $existIds[] = $randId; //将产生的id全部记录到$existIds数组中,用来产生不重复的记录id
    $randIds .= $comma . $randId;
    $comma = ',';
    $j++;
    }
    }

    $query = $db->query("SELECT * FROM test WHERE id IN ($randIds) LIMIT 0,$limitNum");
    while($result = mysql_fetch_array($query)) { //找到记录记录内容,重新随机
    $results[$result['id']] = $result; //记录结果内容

    }

    $limitNum = $n - count($results);

    }while(count($results) < $n);

    }var_dump($results);?>