标签:固定 实现 最小 图片 数据库数据 http field res limit
今天我们要实现从随机抽取一条数据库记录的功能,并且抽取出来的数据记录不能重复;
1、首先我们看文章表中的数据:
2、实现功能代码如下:
1 /** 2 * 获取随机的N篇文篇 3 * @param int $len 文章篇数 4 */ 5 public static function getRandom($len = 6) { 6 # 查询数据库,得到最小Id 7 # SELECT min(id) FROM mimi_aritcle 8 $min = Db::name(self::$tb)->field(‘min(id)‘)->select(); 9 $min = $min[0][‘min(id)‘]; 10 11 # 查询数据库,得到最大id 12 # SELECT max(id) FROM mimi_article 13 $max = Db::name(self::$tb)->field(‘max(id)‘)->select(); 14 $max = $max[0][‘max(id)‘]; 15 16 # 初始化存储数据 17 $result = []; 18 # 初始化id数组 19 $randId_arr = []; 20 21 for ($i = 1; $i <= $len; $i++) { 22 # 先设重复提取记录为false,进入do循环 23 $is_repeat_2 = false; 24 25 # do..while,即使条件不成立,循环起码执行一次 26 do { 27 do { 28 # 随机提取出一个整数记录,该记录和数据库id无关 29 $randId = rand($min, $max); 30 31 # 判断是否有重复提取的记录 32 $is_repeat = in_array($randId, $randId_arr); 33 } while ($is_repeat); 34 35 if($is_repeat_2){ 36 # 将提取出的不同id进行入栈 37 array_push($randId_arr, $row[0][‘id‘]); 38 } 39 40 # 抽取一条数据库记录 41 /** 42 * 首先,我们要记住:我们在上面获取的最小id和最大id是从数据库中获取的,就能保证数据库中一定有id=1和id=50的记录; 43 * 所以, 44 * 1、这里使用id>$randId而不是id=$randId,是防止数据库中的某条记录被删除,导致找不到数据库中对应的id记录; 45 * 例子: 46 * (1) 如果随机抽取的$randId为6,那么使用功能id>$randId-1的话,就会读取到数据库中所有id>5的记录而不是固定一条记录; 47 * 从数据库截图中,我们可以看到,能够读取到数据库id=10、20、30、40、50的记录 48 * (2) 如果我们使用id=$randId,随机抽取的$randId为6,那么使用功能id=$randId的话,就会读取到数据库中id=6的固定记录, 49 * 但是数据库中没有id=6的记录,就会发生错误 50 * 51 * 2、这里使用id>$randId-1而不是id>$randId,是为了防止我们随机抽取的数为最大数50的时候,条件不成立, 52 * 从而导致报错,因为id=50是数据库中最大数了 53 * 例如: 54 * (1) 如果随机抽取的$randId为最大数50,那么使用功能id>$randId-1的话,就会读取到数据库中所有id>49的记录, 55 * 由于符合id>49条件的只有id=50的记录,那么就能保证,我有数据可以提取到; 56 * (2) 如果随机抽取的$randId为最大数50,那么使用功能id>$randId的话,就会读取到数据库中所有id>50的记录, 57 * 但是数据库中没有符合条件的数据,就会发生错误 58 * 59 * 3、这里使用limit原因:因为我们需要的是一条记录,而不是一个列表,所以,我们只需要提取符合条件的第一条记录即可 60 * 例子: 61 * (1) 如果随机抽取的$randId为6,那么使用功能id>$randId-1的话,就会读取到数据库中所有id>5的记录而不是固定一条记录; 62 * 从数据库截图中,我们可以看到,能够读取到数据库id=10、20、30、40、50的记录,但是我们循环一次只需要一条记录,那么 63 * 只需要提取第一条符合的记录,就是id=10的记录 64 * (2) 如果我们不使用limit的话,那么系统就会把所有符合条件的记录都提取出来 65 * 66 */ 67 $row = Db::name(self::$tb) 68 ->field(‘id, title, href‘) 69 ->where([‘id‘ => [‘>‘, $randId - 1]]) 70 ->order(‘id‘) 71 ->limit(0, 1) 72 ->select(); 73 74 # 判断是否有重复提取的数据库记录 75 $is_repeat_2 = in_array($row[0][‘id‘], $randId_arr); 76 } while ($is_repeat_2); 77 78 # 将提取出来的数据库id进行入栈 79 array_push($randId_arr, $row[0][‘id‘]); 80 81 if(empty($row)){ 82 return false; 83 } 84 85 # 将提取出的所有最终数据库数据入栈 86 array_push($result, $row[0]); 87 } 88 89 return $result; 90 }
以上
加油ヾ(?°?°?)??
标签:固定 实现 最小 图片 数据库数据 http field res limit
原文地址:https://www.cnblogs.com/finalanddistance/p/10177887.html