【原】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-->

ExpandedBlockStart.gif 创建随机数
 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)如果是大数据量,还可以试试下面的做法

ExpandedBlockStart.gif 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   floor RAND ()  *  (( SELECT   MAX (id)  FROM  表名) - ( SELECT   MIN (id)  FROM  表名))  +  ( SELECT   MIN (id)  FROM  表名)))  
3  ORDER   BY  id LIMIT  1 ;

 

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

测试数据创建:

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

ExpandedBlockStart.gif 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();

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值