mysql - mysql Rand() 函数导致意外的多行结果
问题描述
当我尝试使用RAND()
函数通过 id 从表中获取随机行时,我得到了意想不到的不稳定结果。以下查询(其中 id 列是主键)返回 1、2 甚至更多行:
我也尝试了下一个变体,它产生了相同的结果:
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 的概率被选中!
推荐阅读
- javascript - 如何在反应中编写多出口?
- r - 删除列向量中的数字和点
- javascript - React Native - 动画宽度缩小
- symfony - 使用 Symfony 和 VichUploader 的 base64 图像到图像文件
- typescript - 使同级目录中的打字稿接口全局可用
- unity3d - Azure Active Directory Unity 身份验证错误
- oracle - 从显式光标中选择
- php - 为什么给出最后一次迭代,而不是当前迭代?
- r - For循环:R中的“要替换的项目数不是替换长度的倍数”
- c++ - 为什么 v8::Isolate::New 中的 v8 段错误?