从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)...
从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)
一、总结
一句话总结:最好的是这个:"SELECT * FROM table WHERE id >= ((SELECT MAX(id) FROM table)-(SELECT MIN(id) FROM table)) * RAND() + (SELECT MIN(id) FROM table)LIMIT n";
1、thinkphp里面没有封装mysql中的Rand()方法,如何在thinkphp实现join其它表加随机取数据?
可以先拼接数据,也可以后拼接数据,完全都ok的
所以可以在thinkphp里面用原生的sql语言取出一条随机数据,然后再和其它表拼接
拼接数据表的另外一种思路,先查数据然后再拼接。
1//3、一个完完全全随机的从题库中获取题目的函数 2public function battle_entirely_random_question(){3 //可以先拼接数据,也可以后拼接数据,完全都ok的4 $data=https://www.it610.com/article/Db::query("SELECT * FROM lg_blog_question WHERE bq_id >= (((SELECT MAX(bq_id) FROM lg_blog_question)-(SELECT MIN(bq_id) FROM lg_blog_question)) * RAND() + (SELECT MIN(bq_id) FROM lg_blog_question)) LIMIT ?",[5]); 5 //dump($data); die; 6 if($data){7 shuffle($data); 8 if(isset($data[0])){9 $blogModle=new Blog(); 10 $blogData=https://www.it610.com/article/$blogModle->getBlogDateById($data[0]['bq_b_id']); 11 if(!$blogData) return false; 12 $result=array_merge($data[0],$blogData); 13 dump($result); die; 14 //拼接 15 return $data[0]; 16} 17 return false; 18 }else{ 19 return false; 20} 21 }
二、从数据表中随机抽取n条数据的几种方法 1、"SELECT * FROM table ORDER BY RAND() LIMIT n";
2、"SELECT *, myrand as RAND() FROM table ORDER BY myrand LIMIT n";
3、"SELECT * FROM table WHERE id >= ((SELECT MAX(id) FROM table)-(SELECT MIN(id) FROM table)) * RAND() + (SELECT MIN(id) FROM table)LIMIT n";
前两种速度差不多,都比较慢,不推荐使用,最后一种是在最大ID和最小ID中随机抽取,速度非常快。
三、SQL 1.MS SQL Server,随机查询20条
select top 20* from表名order by newid()
2.My SQL:,随机查询20条
select*from表名 order by rand() limit 20
文章图片
你可以试试这个: select * from xx order by rand() limit 10
【从数据表中随机抽取n条数据有哪几种方法(join实现可以先查数据然后再拼接)...】
四、thinkphp 可在thinkphp使用原生查询解决这个问题
支持在原生查询的时候使用参数绑定,包括问号占位符或者命名占位符,例如:
Db::query("select * from think_user where id=? AND status=?",[8,1]);
// 命名绑定 Db::execute("update think_user set name=:name where status=:status",['name'=>'thinkphp','status'=>1]);
原生查询可以带参数,很方便的。
1//3、一个完完全全随机的从题库中获取题目的函数 2public function battle_entirely_random_question(){ 3//可以先拼接数据,也可以后拼接数据,完全都ok的 4$data=https://www.it610.com/article/Db::query("SELECT * FROM lg_blog_questionWHERE bq_id >= (((SELECT MAX(bq_id) FROM lg_blog_question)-(SELECT MIN(bq_id) FROM lg_blog_question)) * RAND() + (SELECT MIN(bq_id) FROM lg_blog_question))LIMIT ?",[5]); 5//dump($data); die; 6if($data){ 7shuffle($data); 8if(isset($data[0])){ 9$blogModle=new Blog(); 10$blogData=https://www.it610.com/article/$blogModle->getBlogDateById($data[0]['bq_b_id']); 11if(!$blogData) return false; 12$result=array_merge($data[0],$blogData); 13dump($result); die; 14//拼接 15return $data[0]; 16} 17return false; 18}else{ 19return false; 20} 21}
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- 一个人的碎碎念
- 我从来不做坏事
- 从蓦然回首到花开在眼前,都是为了更好的明天。
- 西湖游
- 改变自己,先从自我反思开始
- leetcode|leetcode 92. 反转链表 II
- 从我的第一张健身卡谈传统健身房
- 自媒体形势分析
- 操作系统|[译]从内部了解现代浏览器(1)