zoukankan      html  css  js  c++  java
  • 【原】MySQL数据库中取出若干条数据、且要求每次都不一样的解决

    问题:从MySQL数据库中取出若干条数据、且要求每次都不一样?

    ------------------------------------------------------------------------------------------------------------------------

    解答:

    情况1)如果不是大数据量,那么可以一条SQL语句解决

    1 SELECT * FROM 表名 ORDER BY RAND() LIMIT 范围起始值,范围终止值;

    情况2)如果是大数据量,那么上面的写法就显得不那么适合了,可以参考如下的做法:

    步骤1.取出数据库中数据编号的最大值和最小值

    1 SELECT MIN(id), MAX(id) FROM 表名;

    步骤2.利用编程语言根据得到的最大值和最小值产生随机数,比如:

    PHP-->

    1 $id = rand(得到的最小值,得到的最大值);

    或者

    1 $id = mt_rand(得到的最小值,得到的最大值);

    C#/JAVA-->

    创建随机数
     1 public static int CreateRand(int minValue,int maxValue)
     2 {   
     3    int temp = 0;   
     4    try
     5    {
     6        if(minValue > maxValue)
     7        {   
     8            temp = new Random().nextInt(minValue - maxValue);   
     9            return temp + maxValue;   
    10        }
    11        else
    12        {   
    13            temp = new Random().nextInt(maxValue - minValue);   
    14            return temp + minValue;   
    15        }      
    16     }catch(Exception e){   
    17         e.printStackTrace();   
    18     }   
    19     return temp + minValue;
    20 }

    步骤3.将生成的随机数再放入SQL语句中查询

    1 SELECT * FROM 表名 WHERE id >= 随机数 LIMIT 范围起始值,范围终止值;

    情况3)如果是大数据量,还可以试试下面的做法

    SQL
    1 SELECT * FROM 表名 AS t1 
    2 JOIN 
    3 (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM 表名)-(SELECT MIN(id) FROM 表名))+(SELECT MIN(id) FROM 表名)) AS id) AS t2 
    4 WHERE t1.id >= t2.id 
    5 ORDER BY t1.id LIMIT 范围起始值,范围终止值;

    不推荐这样的做法

    1 SELECT * FROM 表名 
    2 WHERE id >= (SELECT floorRAND() * ((SELECT MAX(id) FROM 表名)-(SELECT MIN(id) FROM 表名)) + (SELECT MIN(id) FROM 表名)))  
    3 ORDER BY id LIMIT 1;

     

    ------------------------------------------------------------------------------------------------------------------------

    测试数据创建:

    使用存储过程创建大数据量数据

    SQL
     1 --表结构如下:
     2 create table demo(id serial,username varchar(20),password varchar(20));
     3 
     4 --创建存储过程
     5 delimiter $$
     6 SET AUTOCOMMIT = 0$$
     7 
     8 create  procedure test1() 
     9 begin
    10 declare v_cnt decimal (10)  default 0 ;
    11 dd:loop 
    12           insert into demo values (null,'admin','admin'),(null,'test','test'),(null,'user','user');
    13                   commit;
    14                     set v_cnt = v_cnt+10 ;
    15                            if  v_cnt = 100000 then leave dd;
    16                           end if;
    17          end loop dd ;
    18 end;$$
    19 
    20 delimiter;
    21 
    22 --调用存储过程
    23 CALL test1();
  • 相关阅读:
    架构师之路
    责任链设计模式
    Junit框架分析
    线程详解
    课程总结
    IO流
    Java第四次作业
    Character string
    实训
    实训SI
  • 原文地址:https://www.cnblogs.com/temptation/p/1866674.html
Copyright © 2011-2022 走看看