当我尝试使用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中进行了实验,结果相同。
答案 0 :(得分:3)
该行为并非意外。 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!