最近用php写了一个从mysql数据库随机读取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);
?>