大家都知道MYSQL自带的“Order By Rand”数据量大时是非常缓慢的,于是有了各种优化的随机查询方法,这是我所知的最优的方法,不知道还有没有更快的,分亨下~
<?php
// 先查询出表中最小的ID和最大的ID以作使用
$sql = "SELECT MIN(id) as min, MAX(id) as max FROM #@__table WHERE 1";
// 省略取值过程~,$row为结果{min,max}
......
// 生成要取的随机ID
$randId = rand($row['min'], $row['max']);
// 查询语句
$querySql = "SELECT * FROM #@__table WHERE id>=$randId LIMIT 1";
// 执行语句得出结果
......
说明 : 先从表中查询出最小和最大的id,然后使用rand()生成一个随机id,这个id就是我们要来查询的基数,最后查询出表中id大于等于前面生成的随机id的记录,注意这里用大于等于而不是等于,原因是为了避免表中id不连续的情况。对于要查询多条结果,可以使用前面查询的$row再用rand()生成一个id,相同方法查询出来保存到数组里就可以了。
============ 不羁的分割线 =============
这是我自用的数据库类中的代码,仅供参考,其中方法要自已实现:
function GetRandom($table, $select = '*', $where = '', $limit = 1, $id = 'id') {
$result = array();
$where = $where ? 'AND ' . $where : '';
$r = $this->GetOne("SELECT MIN($id) as min, MAX($id) as max FROM #@__$table WHERE 1 $where");
if ($r) {
if ($limit == 1) {
$randId = rand($r['min'], $r['max']);
$result = $this->GetOne("SELECT $select FROM #@__$table WHERE $id>=$randId $where LIMIT 1");
}
else {
for ($i = 0; $i < $limit; $i++) {
$randId = rand($r['min'], $r['max']);
$result[] = $this->GetOne("SELECT $select FROM #@__$table WHERE $id>=$randId $where LIMIT 1");
}
}
}
return $result;
}