[php]php随机从数据库中随机读取n条不重复记录
最近需要从数据库中随机读取n条不重复记录,发现网上好多都是用SELECT * FROM test ORDER BY rand() LIMIT 0,n
最近需要从数据库中随机读取n条不重复记录,发现网上好多都是用SELECT * FROM test ORDER BY rand() LIMIT 0,n
当数据库量大的时候排序好像费不少时间!
于是就自己写了一个,希望高手指点一二!
test的结构
id test
-----
1 asdfasfdasdf
2 sdfsdfsdf
... ...
- <?php
- //假设数据库已经连接了
- $n = 10; //随机显示的记录数
- $results = $result = array(); //记录结果的数组
- $rowNum = mysql_result(mysql_query("SELECT COUNT(*) AS cnt FROM test"), 0, 0);
- 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(vid) AS cnt FROM test"), 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 ? "AND id NOT IN ($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 * FROM test WHERE id <= $randId $existIdExp LIMIT 0,1");
- if($result = mysql_fetch_array($query)) { //找到记录记录内容,重新随机
- $results[$result['id']] = $result;
- $existId .= $comma.$result['id'];
- $comma = ',';
- $i++;
- } else { //没有找到记录,缩小随机的范围
- $minNum++;
- }
- } else {
- $query = mysql_query("SELECT * FROM test WHERE id >= $randId $existIdExp LIMIT 0,1");
- if($result = mysql_fetch_array($query)) { //找到记录记录内容,重新随机
- $results[$result['id']] = $result;
- $existId .= $comma.$result['id'];
- $comma = ',';
- $i++;
- } else { //没有找到记录,缩小随机的范围
- $maxNum--;
- }
- }
- }
- }
- var_dump($results);
- ?>
热门文章推荐
- [php]优酷真实视频地址解析算法
- [Dz]discuz手机版支持视频播放的方法
- [PHP]php加密js解密的方法实例
- [php]用PHP打印出前一天的时间格式
- [PHP]mpeg,mp3,avi的ffmpeg的php转换类
- [php]php中3DES加密一个非常有用的3des加密
- [PHP]php.ini修改上传文件的大小限制处理方法
- [php]用过的最好用的php分页类源代码
请稍候...