【问题标题】:mysql Rand() function cause unexpected multirow resultsmysql Rand() 函数导致意外的多行结果
【发布时间】:2019-08-25 01:59:39
【问题描述】:

当我尝试使用RAND() 函数从表中获取随机行时,我得到了意想不到的不稳定结果。以下查询(其中 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 中进行了实验,结果相同。

【问题讨论】:

  • 只需将LIMIT 添加到您的原始 SQL 中
  • 您可能还会发现this soution 很有用。

标签: mysql sql random mysql-5.6


【解决方案1】:

这种行为并不意外。 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 的概率被选中!

【讨论】:

  • 你能解释每行概率如何影响 SELECT 结果。是否可以预期没有行以及 1 行以上的结果?
  • @Martin 我已经强调了every这个词。 0 行和 1+ 都是预期的。我没有测试过,但理论上,如果你执行上述查询 1000 次并记下所有 id,你会注意到每一行都被选中了大约 1 次。
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 2014-09-04
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多