从数据表中随机抽取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、一个完完全全随机的从题库中获取题目的函数
 2     public function battle_entirely_random_question(){  3 //可以先拼接数据,也可以后拼接数据,完全都ok的  4 $data=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=$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

 

四、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、一个完完全全随机的从题库中获取题目的函数
 2     public function battle_entirely_random_question(){
 3         //可以先拼接数据,也可以后拼接数据,完全都ok的
 4         $data=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=$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     }

 

 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值