mysql Rand() 函数导致意外的多行结果

标签 mysql sql random mysql-5.6

当我尝试使用 RAND() 函数通过 id 从表中获取随机行时,我得到了意想不到的不稳定结果。以下查询(其中 id 列为主键)返回 1、2 甚至更多行:

query and result

我也尝试了下一个变体,它产生了相同的结果:

SELECT id, word FROM words WHERE id = FLOOR(RAND() * 1000)

我为我的任务找到了另一个解决方案:

SELECT id, word FROM words ORDER BY RAND() LIMIT 1

但我想知道为什么使用如此基本的功能时 MySQL 的行为如此出乎意料。吓到我了。

我在不同的 IDE 中进行了实验,结果相同。

最佳答案

这种行为并不意外。 RAND()函数按行计算:

SELECT RAND() FROM sometable LIMIT 10

+----------------------+
| RAND()               |
+----------------------+
|   0.7383128467372738 |
|   0.6141578719151746 |
|   0.8558508500976961 |
|   0.4367806654766022 |
|   0.6163508078235674 |
|   0.7714120734216757 |
|   0.0080079743713214 |
|   0.7258036823252251 |
|   0.6049945192458057 |
|   0.8475615799869984 |
+----------------------+

记住这一点,这个查询:

SELECT * FROM words WHERE id = FLOOR(RAND() * 1000)

意味着 ID 介于 0 和 999 之间的每一行 有 1/1000 的概率被选中!

关于mysql Rand() 函数导致意外的多行结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496857/

相关文章:

c# - 使用加权值随机执行操作

mysql - WordPress 数据库问题

mysql - 如何使用 ER 图创建表和关系?

php - 发送每日通知电子邮件的正确加入(PHP、Mysql)

MySQL:在一个查询中获取不同表中的值?

javascript - 如何使用javascript中的数组获取随机播放的歌曲?

php - 没有重复的随机数生成

php - 从一张表中抓取Mysql数据并为具有特定ID的特定用户显示它

php - 获取最后插入的事件

sql - 如果不存在则插入