【原】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 }
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 范围起始值,范围终止值;
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;
2 WHERE id >= (SELECT floor( RAND() * ((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();
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();