随机从数据库抽取数据的方法有很多,可以用Mysql的原生语句去抽取,也可以先用PHP随机数来抽取。这里波波就分享一个速度非常快的thinkphp5随机查询数据库指定条数数据的方法。希望对其他小伙伴有帮助。
源代码:
- public function getRandomRec($table,$num){
- $countcus = Db::name($table)->count();
- $min = Db::name($table)->min('id');
- $max = $min+$countcus;
- if($countcus < $num){$num = $countcus;}
- $i = 1;
- $flag = 0;
- $ary = array();
- while($i<=$num){
- $rundnum = rand($min, $max);
- if($flag != $rundnum){
- if(!in_array($rundnum,$ary)){
- $ary[] = $rundnum;
- $flag = $rundnum;
- }else{
- $i--;
- }
- $i++;
- }
- }
- $data = Db::name($table)->where('id','in',$ary,'or')->select();
- return $data;
- }
上面的代码中我们首先获取了数据库的最大记录数,然后在最小记录和最大记录中用PHP生成随机数之后,进行的查询。效率比起原生的Mysql查询要快很多,尤其对于数据量较大的场景。
2018年2月2日,补充一个新的方法以减少数据库的读操作。
源代码:
- public function getNewsRandom($num){
- $newslist = Cache::get('newslist'); //自己定义一个cache_key
- if(emptyempty($newslist)){
- $newslist = Db::name($this->table)->where(array('is_show'=>1))->cache('newslist',3600)->select();
- }
- $random_keys = array_rand($newslist,$num);
- foreach($random_keys as $key=>$value){
- $data[] = $newslist[$value];
- }
- return $data;
- }
这个方法的优势在于不仅能够降低数据库的读取频次还能避免数据库某数据删除后用PHP随机数查出空数据的问题。