大家都知道MYSQL自带的“Order By Rand”数据量大时是非常缓慢的,于是有了各种优化的随机查询方法,这是我所知的最优的方法,不知道还有没有更快的,分亨下~
=$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; }