Linux|系统管理|WEB开发

关注Linux,系统管理,WEB开发以及开源世界

随机获取N条数据库记录的几个方法

| Comments

我需要从一个数据库表中随机的获取N条数据库,最先想到的办法是两次访问数据库,第一次是获得记录条数M, 然后在产生个N随机数K_j(0<=j< N),其中0<=K_j<=M. 然后获取键值为K_j的记录数。 但是两次查询数据库是其缺点,简单实现方法如下:

$range_result = mysql_query( " SELECT MAX(id) AS max_id , MIN(id) AS
min_id FROM tb_name ");  
$range_row = mysql_fetch_object( $range_result );  
$random = mt_rand( $range_row->min_id , $range_row->max_id );  
$result = mysql_query( " SELECT * FROM tb_name WHERE id >= $random
LIMIT 0,1 ");

于是查阅其手册(MySQL),其中提到用order by rand() 和limit两结合来获取随机记录。另外google了一下,还发现了其他一些好的方法,特记录下来:

  1. 采用官方的方式

    select * from tb_name order by rand() limit N

  2. 采用类似偏移方式

    select * from tb_name where id >= (select floor(max(id) * rand()) from tb_name ) order by id asc limit N;

  3. 优化的方式

    select * from tb_name as r1 join (select round(rand() * (select max(id) from tb_name)) as id2) as r2 where r1.id >= r2.id2 order by r1.id asc limit N;

上述方法,第一种效率最低,第三种最好。

Comments