最近需要从数据库中随机读取n条不重复记录,发现网上好多都是用
SELECT*FROMtestORDERBYrand()LIMIT0,n
当数据库量大的时候排序好像费不少时间!
于是就自己写了一个,希望高手指点一二!

test的结构

idtest
-----
1asdfasfdasdf
2sdfsdfsdf
......



<?php

//假设数据库已经连接了

$n=10; //随机显示的记录数
$results=$result=array(); //记录结果的数组

$rowNum=mysql_result(mysql_query("SELECTCOUNT(*)AScntFROMtest"),0,0);

if($rowNum<50){ //数据量小的话,这样反而可以提高效率,当然50可以随便改

$query=mysql_query("SELECT*FROMtestORDERBYrand()LIMIT0,$n");
while($result=mysql_fetch_array($query)){
$results[$result['id']]=$result;
}

}else{

//随机的范围
$maxNum=mysql_result(mysql_query("SELECTMAX(vid)AScntFROMtest"),0,0);
$minNum=1;
$midNUm=intval($maxNum/2);

//随机的id
$randId=null;

//已存在的id集合格式为xx,xx,xx,xx
$existId='';
$comma='';

$i=0;
while($i<$n&&$minNum<=$maxNum){

$query='';

//再查询中剔除已存在的id
$existIdExp=$existId?"ANDidNOTIN($existId)":'';

do{
mt_srand((float)microtime()*1000000);
$randId=mt_rand($minNum,$maxNum);
}while(array_key_exists($randId,$results)); //如果产生id已经存在,继续随机

if($randId<=$midNUm){

$query=mysql_query("SELECT*FROMtestWHEREid<=$randId$existIdExpLIMIT0,1");
if($result=mysql_fetch_array($query)){ //找到记录记录内容,重新随机

$results[$result['id']]=$result;
$existId.=$comma.$result['id'];
$comma=',';
$i++;

}else{ //没有找到记录,缩小随机的范围
$minNum++;
}

}else{

$query=mysql_query("SELECT*FROMtestWHEREid>=$randId$existIdExpLIMIT0,1");
if($result=mysql_fetch_array($query)){ //找到记录记录内容,重新随机

$results[$result['id']]=$result;
$existId.=$comma.$result['id'];
$comma=',';
$i++;

}else{ //没有找到记录,缩小随机的范围
$maxNum--;
}

}

}


}

var_dump($results);

?>

13 个解决方案

#1


写得很高级,接分.

更多相关文章

  1. mysql数据库监控利器lepus天兔工具安装和部署
  2. VS2015 使用Mysql-connector/c++ 链接数据库(环境配置)
  3. MySQL数据库语法-多表查询练习一
  4. php将图片以二进制形式保存到mysql数据库的解决方法
  5. 蜂巢和数据库之间的完整性检查
  6. MySQL数据库多表查询
  7. 数据库keepalived部署文档
  8. linux系统下安装多个MySql数据库并做主从配置(个人项目经验)
  9. Navicat工具备份还原mysql数据库详细图解

随机推荐

  1. Android Handler内存泄露
  2. Android中EditText属性
  3. android禁止锁屏保持常亮
  4. Android Gradle使用详解
  5. Android CTS(兼容性测试)
  6. Android浏览器显示大分辨率图片的问题
  7. android中控制EditText不可编辑的问题
  8. android里面的USB功能-----Accessory模式
  9. 如何打包你自己的apk程序到Android里?
  10. Android(安卓)之 Activity和Intent用法介