mysql 查1到100_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));

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

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

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

神奇的事情发生了

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

6eb1cc7ae040db36314cb858d293c6ac.png

我瞬间人傻了

问题排查

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

官网也有一个说明是:

mysql> SELECT * FROM table1, table2 WHERE a=b AND c

-> 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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值