zoukankan      html  css  js  c++  java
  • 从数据表中随机抽取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     }
     
  • 相关阅读:
    PHP 实现下载文件到本地
    PHP 文件上传服务端及客户端配置参数说明
    报错: WARN hdfs.DFSClient: Caught exception java.lang.InterruptedException
    报错: Name node is in safe mode
    转载:CSS的组成,三种样式(内联式,嵌入式,外部式),优先级
    Windows 7 SP1 x64 旗舰版 微软官方安装U盘的制作
    jQuery滑过头像图片展示个人信息效果
    SQL Developer 4.1.3
    [转]内嵌页面iframe以及和其兄弟iframe的相互传值
    Environment variable:"PATH" 状态 失败
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/9323211.html
Copyright © 2011-2022 走看看