从数据表中随机抽取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]);

原生查询可以带参数,很方便的。

     //3、一个完完全全随机的从题库中获取题目的函数
public function battle_entirely_random_question(){
//可以先拼接数据,也可以后拼接数据,完全都ok的
$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]);
//dump($data);die;
if($data){
shuffle($data);
if(isset($data[0])){
$blogModle=new Blog();
$blogData=$blogModle->getBlogDateById($data[0]['bq_b_id']);
if(!$blogData) return false;
$result=array_merge($data[0],$blogData);
dump($result);die;
//拼接
return $data[0];
}
return false;
}else{
return false;
}
}
 

最新文章

  1. 【转】Java开发中JDBC连接数据库代码和步骤总结
  2. MySQL: Tree-Hierarchical query
  3. 报错:No package erlang available
  4. django重量级web框架
  5. jquery 复制DIV与相关事件
  6. HashMap遍历
  7. 协议系列之HTTP协议
  8. [EXCEL] 在单元格中自动输入时间和日期
  9. 结束指定Activity实例代码
  10. 转:Visual C++ sprintf()函数用法
  11. openlayers3应用一:显示百度地图
  12. Scala入门系列(十一):模式匹配
  13. Android进阶(十九)AndroidAPP开发问题汇总(三)
  14. Solr 15 - Solr添加和更新索引的过程 (文档的路由细节)
  15. Python爬虫爬取网页图片
  16. Archiver 3 for Mac(解压缩工具) ,想压缩解压慢一点就这么难!
  17. 我最喜欢的Mybatis 3.5新特性!超实用!
  18. face detection[PyramidBox]
  19. PL/SQL如何调试sql语句、存储过程
  20. Qt 快捷键 复制当前行 向上复制 && 向下复制

热门文章

  1. 【Linux下tar命令详解】
  2. 便捷编程-Xcode常用第三方插件 (随时更新)
  3. Vue2.0八——知识点整理
  4. 00075_BigInteger
  5. 利用命令行删除Android系统自带应用的方法
  6. [Python] Understand Mutable vs. Immutable objects in Python
  7. 【面试加分项】java自己定义注解之申明注解
  8. 关于jquery的事件命名空间
  9. html页面中块级元素的居中
  10. SDNU 1206.蚂蚁感冒 【代码如此简单,思维练习】【7月29】