今天我们要实现从随机抽取一条数据库记录的功能,并且抽取出来的数据记录不能重复;

  1、首先我们看文章表中的数据:

  

  2、实现功能代码如下:

  

  1   /**
* 获取随机的N篇文篇
* @param int $len 文章篇数
*/
public static function getRandom($len = 6) {
# 查询数据库,得到最小Id
# SELECT min(id) FROM mimi_aritcle
$min = Db::name(self::$tb)->field('min(id)')->select();
$min = $min[0]['min(id)']; # 查询数据库,得到最大id
# SELECT max(id) FROM mimi_article
$max = Db::name(self::$tb)->field('max(id)')->select();
$max = $max[0]['max(id)']; # 初始化存储数据
$result = [];
# 初始化id数组
$randId_arr = []; for ($i = 1; $i <= $len; $i++) {
# 先设重复提取记录为false,进入do循环
$is_repeat_2 = false; # do..while,即使条件不成立,循环起码执行一次
do {
do {
# 产生一个随机整数
# 注意:产生的整数与数据库无关,不要因为两个参数是从数据库中得到的,
# 就误以为是在产生数据库中的随机id
$randId = rand($min, $max); # 判断是否有重复提取的记录
$is_repeat = in_array($randId, $randId_arr);
} while ($is_repeat); if($is_repeat_2){
# 将提取出的不同id进行入栈
array_push($randId_arr, $row[0]['id']);
} # 抽取一条数据库记录
/**
* 首先,我们要记住:
* 步骤一表图中查询数据库,获取到最小id是1, 最大id是50,就能知道数据库中一定有id=1和id=50的记录
* 所以,
* 1、这里使用id>$randId而不是id=$randId,是防止数据库中的某条记录被删除,导致找不到数据库中对应的id记录;
* 例子:
* (1) 如果随机抽取的$randId为6,那么使用条件id>$randId-1的话,就会读取到数据库中所有id>5的记录;
* 从数据库截图中,我们可以看到,能够读取到数据库id=10、20、30、40、50的记录
* (2) 如果我们使用id=$randId,随机抽取的$randId为6,那么使用功能id=$randId的话,就会读取到数据库中id=6的固定记录,
* 但是数据库中没有id=6的记录,就会发生错误
*
* 2、这里使用id>$randId-1而不是id>$randId,是为了防止我们随机抽取的数为最大数50的时候,条件不成立,
* 从而导致报错,因为id=50是数据库中最大数了
* 例如:
* (1) 如果随机抽取的$randId为最大数50,那么使用条件id>$randId-1的话,就会读取到数据库中所有id>49的记录,
* 由于符合id>49条件的只有id=50的记录,那么就能保证,我有数据可以提取到;
* (2) 如果随机抽取的$randId为最大数50,那么使用条件id>$randId的话,就会读取到数据库中所有id>50的记录,
* 但是数据库中没有符合条件的数据,就会发生错误
* (3) 如果随机抽取的$randId为最小数1,使用条件 id>$randId 的话,id = 1 的记录永远也不能被随机选中
*
* 3、这里使用order('id ASC')而不是order('id DESC')原因:当我们获取到数据后,要获取最接近$randId的值
* (1) 如果随机抽取的$randId为6,我们就能从所有id>5的记录,即id=10、20、30、40、50
* 的记录,这时候的结果是循环6次后的总体列表,那我们需要最靠近6的记录,就需要使用order('id ASC')
* 进行升序排列,这时候,列表中的第一个数据就是id=10的,就是我们想要的记录
* (2) 如果随机抽取的$randId为6,我们就能从所有id>5的记录,即id=10、20、30、40、50
* 的记录,如果使用order('id DESC'),那么我们得到的数据永远是最不靠近6的记录,即id=50的记录
* (3) 不使用order,有时候会排列不一样,(通常在数据记录不同时才会发现到)
*
* 4、这里使用limit原因:因为我们需要的是一条记录,而不是一个列表,所以,我们只需要提取符合条件的第一条记录即可
* 例子:
* (1) 如果随机抽取的$randId为6,那么使用条件id>$randId-1的话,就会读取到数据库中所有id>5的记录而不是固定一条记录;
* 从数据库截图中,我们可以看到,能够读取到数据库id=10、20、30、40、50的记录,但是我们循环一次只需要一条记录,那么
* 只需要提取第一条符合的记录,就是id=10的记录
* (2) 如果我们不使用limit的话,那么系统就会把所有符合条件的记录都提取出来
*
*/
$row = Db::name(self::$tb)
->field('id, title, href')
->where(['id' => ['>', $randId - 1]])
->order('id ASC')
->limit(0, 1)
->select(); # 判断是否有重复提取的数据库记录
$is_repeat_2 = in_array($row[0]['id'], $randId_arr);
} while ($is_repeat_2); # 将提取出来的数据库id进行入栈
array_push($randId_arr, $row[0]['id']); if(empty($row)){
return false;
} # 将提取出的所有最终数据库数据入栈
array_push($result, $row[0]);
} return $result;
}

  

  

  以上

  加油ヾ(◍°∇°◍)ノ゙

MYSQL:随机抽取一条数据库记录的更多相关文章

  1. TODO:从数据库中随机抽取一条记录

    TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...

  2. laravel如何从mysql数据库中随机抽取n条数据

    laravel如何从mysql数据库中随机抽取n条数据 一.总结 一句话总结: inRandomOrder():$userQuestions=UserQuestion::where($map)-> ...

  3. php 数组 高效随机抽取指定条记录的算法

    php使用数组array_rand()函数进行高效随机抽取指定条数的记录,可以随机抽取数据库中的记录,适合进行随机展示和抽奖程序. 该算法主要是利用php的array_rand()函数,下面看一下ar ...

  4. Oracle整合Mybatis实现list数据插入时,存在就更新,不存在就插入以及随机抽取一条记录

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 目录 Oracle整合Mybatis实现list数据插入时,存在就更新,不存在就插入 entity 对应表中字段,如不对应,在xml中起别名 map ...

  5. MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    MYSQL随机抽取查询:MySQL Order By Rand()效率问题一直是开发人员的常见问题,俺们不是DBA,没有那么牛B,所只能慢慢研究咯,最近由于项目问题,需要大概研究了一下MYSQL的随机 ...

  6. 从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)

    从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接) 一.总结 一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= (( ...

  7. sql 随机抽取几条数据的方法 推荐

    传说用这个语句管用:select top 5 * from tablename order by newid() 我放到sql的查询分析器里去执行果然管用,随机抽取5条信息,不停的换,结果我应用到程序 ...

  8. mysql 随机选取一条记录

    要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1. 1 2 3 4 5 6 7 8 9 1 ...

  9. mysql随机获取一条或者多条数据

    原文地址:http://www.im286.com/thread-7091552-1-1.html 转来备份 研究一些随机的因素,主要是讲究效率问题. 语句一: MYSQL手册里面针对RAND()的提 ...

随机推荐

  1. TortoiseGit安装简单介绍和使用

    首先,你必须有会装软件的技能和一个看得懂英语的眼睛.然后保证Git也装好了 他提供了中文版的安装包哦 安装过程尽量选择默认就行,先装上面那个啊,语言包最后装. 语言配置 因为以前装过,所以...路径是 ...

  2. PostgreSQL 存储过程/函数

    1.有用的链接 postgresql 常用小函数 Postgresql数据库的一些字符串操作函数 PostgreSQL function里面调用function PostgreSQL学习手册(函数和操 ...

  3. 3 不用IDE开发groovy

    1       不用IDE开发groovy 1.1  不用IDE开发的方法 可以在IDE中运行Groovy类或者脚本,但是Groovy也提供了其他运行途径.你能运行Groovy代码基于以下: ·    ...

  4. Vuejs 实现权限管理

    程序运行时,router只配置登陆 首页404 等基本页面 import Main from '@/views/Main.vue'; // 不作为Main组件的子页面展示的页面单独写,如下 expor ...

  5. 查看CPU和内存,用机器指令和汇编指令编程【Debug模式】

    命令 作用 举例 R 查看,改变CPU寄存器的内容 查看:r 改写:r ax D 查看内存中的内容 d 1000:0 f E 改写内存中的内容 e 1000:0 f U 将内存中的机器指令翻译成汇编指 ...

  6. Turing Year 2012

    Turing LectureFrom cryptanalysis to cognitive neuroscience - a hidden legacy of Alan Turinghttp://co ...

  7. SecureCRT中文乱码解决方案

    SecureCRT是一个商业终端连接工具.SecureCRT可以自定义界面颜色方案,可以连接SSH1与SSH2.Telnet等服务.默认设置下,通过SecureCRT连接SSH服务器可能出现中文乱码的 ...

  8. java.lang.IllegalArgumentException: Page directive: invalid value for import 问题处理

    1.问题说明: 项目原来用的tomcat版本是apache-tomcat-6.0,后来为了安全原因将版本升至apache-tomcat-7.0,发现有的jsp页面出现下面的异常: java.lang. ...

  9. shell 重定向 1> 2> &>

    0表示标准输入1表示标准输出2表示标准错误输出> 默认为标准输出重定向,与 1> 相同2>&1 意思是把 标准错误输出 重定向到 标准输出.&>file 意思是 ...

  10. eclipse编码转换

    一般Java文件编码格式是UTF-8的.以下以默认GBK改为UTF-8为例. 1.改变整个工作空间的编码格式,这样以后新建的文件也是新设置的编码格式.     eclipse->window-& ...