码迷,mamicode.com
首页 > 数据库 > 详细

mysql随机查询符合条件的几条记录

时间:2018-06-06 15:57:49      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:改进   between   cas   一个   nbsp   使用   lin   mini   xid   

随机查询,方法可以有很多种。比如,查询出所有记录,然后随机从列表中取n条记录。使用程序便可实现。可是程序实现必须查询出所有符合条件的记录(至少是所有符合条件的记录id),然后再随机取出n个id,查询数据库。但是效率毕竟没有数据库中直接查询得快。下面介绍mysql中怎样随机查询n条记录。

1.最简单的办法order by rand(),示例

select * from question q where q.`level`=1 order by rand() limit 1;

此写法,可以将查询出的结果集打乱,limit n条记录后,得到n条随机的记录,这n条记录也是随机顺序的,就是效率有点慢,但是很随机。

 

2.如果记录id保持连续增长,中间不间断,则可以用其它方式替代上述语句,示例

#随机查询(记录大于某个数,效率高)
select q1.* from question q1 inner join (select (min(q2.id) + round(rand()*(max(q2.id) - min(q2.id)))) as id from question q2 where q2.`level`=1) as t
on q1.id >= t.id limit 1;

#效率略低
select q.* from question q where q.id > (select t.id from (
    select (min(q2.id) + round(rand()*(max(q2.id) - min(q2.id)))) as id from question q2 where q2.`level`=1
) t) limit 1;

#效率极低,比order by rand还低(可能针对每条记录都作了子查询,结果不不连续,很随机)
select q.* from question q where q.id > (select (min(q2.id) + round(rand()*(max(q2.id) - min(q2.id)))) from question q2 where q2.`level`=1) limit 1;

法2的实现原理是,找出符合条件的记录的id范围[minId,maxId],然后随机生成一个id,使id在范围内,算法为id=minId+[0,maxId-minId], [0,maxId-minId]可使用round四舍五入函数和rand随机函数实现。然后大于等于此id的记录既是符合条件的随机的记录。上述写法仅针对查询出一条记录。如果查询出n条记录则sql语句改为:

select q1.* from question q1 inner join (select (min(q2.id) + round(rand()*(max(q2.id)-2 - min(q2.id)))) as id from question q2 where q2.`level`=1) as t
on q1.id >= t.id limit 3;

如上,随机取连续的3条记录,max的值减掉二,就是使范围缩小2,保证随机出来的id,大于等于它时仍可查出3条记录。

 

如果 maxId-(n-1)-minId为负数,就是说数据记录范围内没有n条记录,则上述语句报错,改进版如下:

select q1.* from question q1 inner join (
    select (min(q2.id) + round(rand()* ( case when (max(q2.id)-2)>min(q2.id) then max(q2.id)-2 - min(q2.id) else 0 end ))) as id,min(q2.id) as minId,max(q2.id) as maxId from question q2 where q2.`level`=2
) as t
on q1.id >= t.id and q1.id between t.minId and t.maxId limit 3;

 

附上随机函数的测试代码:

select 10*RAND(); #[0,10)
select FLOOR(10*RAND());#[0,9]
select CEILING(10*RAND()); #[1,10]
select ROUND(10*RAND()); #[0,10]

 

mysql随机查询符合条件的几条记录

标签:改进   between   cas   一个   nbsp   使用   lin   mini   xid   

原文地址:https://www.cnblogs.com/hdwang/p/9144438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!