问题:从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-->
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.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 }
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)如果是大数据量,还可以试试下面的做法
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 ;
------------------------------------------------------------------------------------------------------------------------
测试数据创建:
使用存储过程创建大数据量数据
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![ExpandedBlockStart.gif](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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();