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

随机查询,方法可以有很多种。比如,查询出所有记录,然后随机从列表中取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]

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

时间: 2024-10-14 15:09:14

mysql随机查询符合条件的几条记录的相关文章

取得left join的第二表中符合条件的第一条记录

问题描述 有表一 tableA tid     username     title 1         lily       我公司将进行xx培训 2        angus      关于秋游的通知 3        boss       这个月不发奖金 4        vivi       新产品上市 表二 tableB tid      time     txt 1        0809    大家快来.... 2        0810    我是新来的,大家好 2       

sql语句查询出表里符合条件的第二条记录的方法

创建用到的表的SQL CREATE TABLE [dbo].[emp_pay]( [employeeID] [int] NOT NULL, [base_pay] [money] NOT NULL, [commission] [decimal](2, 2) NOT NULL ) ON [PRIMARY] 生成的表,及表中的数据: --方法一 select top 1 * from ( SELECT TOP 2 * FROM [dbo].[emp_pay] WHERE base_pay = 500

mysql随机查询记录的高效率方法

mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真正测试一下才发现这样效率非常低.一个15万余条的库,查询5条数据,居然要8秒以上 查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低. You cannot use a column with RAND() values in an ORDER BY clause

如何实现MySQL随机查询数据与MySQL随机更新数据?

以下的文章主要介绍的是MySQL随机选取数据,对实现MySQ随机查询数据与MySQ随机更新数据的实际操作步骤的描述,以及对其实际操作中所要用到的语句的描述,以下就是对其具体操作步骤的描述. MySQL随机查询数据 以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了. SELECT * FROM table_name ORDER BY rand() LIMIT 5; MySQ

mysql 随机查询 效率比较

select primary_count as primaryCount, primary_score as primaryScore, junior_count as juniorCount, junior_score as juniorScore, senior_count as seniorCount, senoir_score as senoirScore, total_score as totalScore, pass_score as passScore from pd_paper

MySql 分组排序取时间最大的一条记录

SELECT A.* FROM digital_asset A, (SELECT name, max(last_updated) max_day FROM digital_asset GROUP BY name) B WHERE A.name = B.name AND A.last_updated = B.max_day SELECT A . * FROM bbs_threads A, ( SELECT digest, max( dateline ) max_dateline FROM bbs_

Oracle取查询结果数据的第一条记录SQL

Oracle取查询结果数据的第一条记录SQL: select * from (select * from <table> order by <key>) where rownum=1; select * from (select * from <table> order by <key> desc) where rownum=1;

正则查询符合条件的字符串

由于对正则不熟悉..遇到问题很烦恼.. 比如我要将以下中乱码部分去掉,怎么查询出那些乱码.. `SERIALNO` varchar(60) NOT NULL COMMENT 'å?ˆå?Œæµ?æ°´å?·', `RELATIVESERIALNO` varchar(60) DEFAULT NULL COMMENT 'å…³è?”申请æµ?æ°´å?·', `ARTIFICIALNO` varchar(60) DEFAULT NULL COMMENT '人工å?ˆå?Œç¼–å?·

如何在MySQL中查询当前数据上一条和下一条的记录

如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from table_a      where id =          (select id from              table_a where id < {$id} [and other_conditions]              order by id desc limit 1