码迷,mamicode.com
首页 > 数据库 > 详细

MYSQL:随机抽取一条数据库记录

时间:2018-12-26 11:41:53      阅读:371      评论:0      收藏:0      [点我收藏+]

标签:固定   实现   最小   图片   数据库数据   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     }

 

 

  

  

 

  以上

  加油ヾ(?°?°?)??

MYSQL:随机抽取一条数据库记录

标签:固定   实现   最小   图片   数据库数据   http   field   res   limit   

原文地址:https://www.cnblogs.com/finalanddistance/p/10177887.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!