zoukankan      html  css  js  c++  java
  • MySQL where id = FLOOR(1+ RAND() * 100) 精确查找,结果返回多条数据

    MySQL中若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1))。例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机整数, 可使用以下语句:

    SELECT FLOOR(7 + (RAND() * 6));
    

    信息来源官方中文文档:https://www.mysqlzh.com/doc/117/233.html

    根据id为1-100的随机数,来精确查找某条id的数据

    根据上述说明,为了随机获取一条数据,故使用了以下语句来查询:

    select * from usr_virtual where id = (select FLOOR(1 + RAND() * 100));
    

    神奇的事情发生了

    查询结果超过了一条,竟然有三条???

    我瞬间人傻了

    问题排查

    网上很多朋友说是每条记录都会重新运行一次rand()函数,所以会导致多条结果输出,甚至没有数据输出。
    官网也有一个说明是:

    mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d
    
        -> ORDER BY RAND() LIMIT 1000;
    

    注意,在WHERE语句中,WHERE每执行一次, RAND()就会被再计算一次。

    RAND()的作用不是作为一个精确的随机发生器,而是一种用来发生在同样的 MySQL版本的平台之间的可移动ad hoc随机数的快速方式。

    其实感觉官方的这条解释有点不适用于我的操作,具体什么原因,目前来说比较偏向于网上所说的情况。

    解决方式:对随机函数再嵌套一次子查询

    select * from usr_virtual where id = ( select * from (select FLOOR(1 + RAND() * 100)) as fo);
    
  • 相关阅读:
    MVVM
    vue-cli初始化项目2.x|3.x
    逻辑覆盖
    white box白盒测试
    black box黑盒测试
    总结回顾js arr的常见方法以及相关的使用场景(一)
    js 原生功底 (一)
    markdown 语法总结(一)
    阿里一面,面试官想看到的究竟是什么,带你揭秘!!!!
    关于Axios 源码你想了解的 在这儿
  • 原文地址:https://www.cnblogs.com/qukun/p/14363182.html
Copyright © 2011-2022 走看看