zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    三元运算符嵌套问题
    tp框架利用redis存储session
    PHP date('W')遇到跨年问题
    AES加解密 集成 spring MVC
    python SMTP 发送邮件
    mysql数据库安装过程
    (转)Apache启动过程
    apache服务器全局配置详解
    Apache 的 httpd.conf 详解(很实用)
    安装apache遇到的问题总结
  • 原文地址:https://www.cnblogs.com/hdwang/p/9144438.html
Copyright © 2011-2022 走看看