MySQL数据库中随机获取一条或多条记录

在开发过程当中遇到了一个问题,使用MySQL数据库,用SQL语句在表中随机获取一条或多条数据,查了好多资料,接下来
给你们分享一下: sql

1. 数据库

SELECT * FROM table_name ORDER BY RAND() LIMIT 1;

MySQL中的RAND()函数调用能够在0和1之间产生一个随机数。函数

这条SQL语句能够随机取出一条数据,并且将limit 1改成获取多条数据,获得的数据也是随机的。可是,在MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,由于这样会致使数据列被屡次扫描。致使效率至关的低!可是在MYSQL 3.23版本中,仍然能够经过ORDER BY RAND()来实现随机。spa

2. code

SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*((SELECT MAX(id) 
FROM table_name)-(SELECT MIN(id) FROM table_name))+(SELECT MIN(id) 
FROM table_name)) AS id)AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;

简写版:排序

SELECT * FROM table_name AS t1 JOIN (SELECT ROUND(RAND()*(SELECT MAX(id) 
FROM table_name)) AS id) AS t2 WHERE t1.id>=t2.id ORDER BY t1.id LIMIT 1;

简化的写法将表中的MIN(id)看作0,是对整个数据表进行操做,而第一条能够对某一范围的数据进行操做,视状况而定。开发

在MySQL中,ROUND()函数用于数据的四舍五入。get

这条sql语句的执行效率至关的高,可是,将limit 1改成获取多条数据后,取出的数据不是随机的,缘由是order
by引发的,order by将t1.id给排序了,所以获取到的数据不是随机的。it

3.table

SELECT * FROM table_name as t1 WHERE t1.id>=(RAND()*((SELECT MAX(id) FROM 
table_name)-(SELECT MIN(id) FROM table_name))+(SELECT MIN(id) FROM table_name)) LIMIT 1;

简写版:

SELECT * FROM table_name as t1 WHERE t1.id>=(RAND()*(SELECT MAX(id) FROM table_name))LIMIT 1;

简写效果同上,视状况而定。

这条sql语句的执行效率也是很是高,将limit 1改成获取多条数据,效率也是很高,并且获得的数据是随机的。


总结:语句1的效率低下,切忌使用,不过在数据量少,MYSQL版本支持的状况下可使用;
            语句2的效率高,在随机取出一条记录的状况下可使用;
            语句3的效率也高,在随机取出一条或多条记录的状况下均可以使用,不过在取出一条记录时优先使用语句2,由于采用        JOIN的语法比直接在WHERE中使用函数效率仍是要高一些的。

:语句2和语句3在操做数据库时,数据都是同一种类型或者某一类型的数据是连续存放在一块儿的,不然取出的数据可能不是所 需类型的随机数据,而语句1在任何状况下取出的都是所须要的随机数据。

 

但愿对你们有所帮助!