最近用php写了一个从mysql数据库随机读取n条记录
16lz
2021-01-22
最近需要从数据库中随机读取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);
?>
写得很高级,接分.
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
写得很高级,接分.
更多相关文章
- mysql数据库监控利器lepus天兔工具安装和部署
- VS2015 使用Mysql-connector/c++ 链接数据库(环境配置)
- MySQL数据库语法-多表查询练习一
- php将图片以二进制形式保存到mysql数据库的解决方法
- 蜂巢和数据库之间的完整性检查
- MySQL数据库多表查询
- 数据库keepalived部署文档
- linux系统下安装多个MySql数据库并做主从配置(个人项目经验)
- Navicat工具备份还原mysql数据库详细图解