【原】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();

 

 

posted @ 2010-11-01 22:29  temptation  阅读(606)  评论(0编辑  收藏  举报