【问题标题】:Why does MySQL Rand() hate me?为什么 MySQL Rand() 讨厌我?
【发布时间】:2009-06-15 20:45:31
【问题描述】:

这是我在更大的连接查询上尝试做的事情的简化查询。它仍然在这个小范围内突破。我正在尝试为在 1-60 范围内拉回的每一行生成一个随机数。然后我想按这个随机数对返回的行进行排序。

 SELECT downloads . * , 
(FLOOR( 1 + ( RAND( ) *60 ) )) AS randomtimer
FROM downloads
ORDER BY randomtimer
LIMIT 25 

我有 2 个数据库尝试过此查询。一个现场的和一个开发的。我将两者并排比较,它们在结构上是相同的。它在 dev one 上正常工作。返回由随机计时器排序的行。

实时表在 randomtimer 列中返回全 1。如果我通过 randomtimer ASC 订购,它们将全部变为 60 年代。如果我从 Order By Clause 中删除 randomtimer,它会返回正确的单个值。所以有些东西正在调整 ORDER BY 语句中的值。

有人对此有任何想法吗?我可能会忽略一些东西吗?怎么回事?什么鬼?

【问题讨论】:

  • 你为什么要随机排序?

标签: mysql random


【解决方案1】:

除了什么先生。不明说,还有一个问题。

您正在生成一个介于 1 到 60 之间的随机数,然后选择前 25 行。如果有足够多的行(统计上)最终超过 25 行且随机值为 1,那么前 25 行当然在“randomtimer”列中的值都为 1。

所以这很可能是因为生产中的数据比开发服务器上的数据多得多。

【讨论】:

    【解决方案2】:

    来自RAND docs

    您不能使用带有 RAND() 的列 ORDER BY 子句中的值,因为 ORDER BY 将评估该列 多次。但是,您可以 以随机顺序检索行,例如 这个:

    mysql> SELECT * FROM tbl_name ORDER BY 兰德();

    我猜差异是由于不同的 MySQL 版本、查询计划或表数据,但不知道是哪一个。

    【讨论】:

      【解决方案3】:

      我决定放弃这个想法,在 php 中创建一个与返回结果长度相同的随机数数组,然后对其进行排序和使用。

      【讨论】:

        【解决方案4】:

        我会抛出一个想法...... RAND 函数使用时间作为它的种子。在实时系统上,整个查询在同一毫秒内完成,因此所有随机数都是相同的。在开发系统上,它需要更长的时间,所以你会得到更多的随机数。如果您的实时系统比您的开发系统更强大,这可能是有意义的。

        只是一个想法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-08
          • 2010-09-05
          • 2011-05-20
          • 2015-10-07
          • 2011-02-10
          • 2011-02-02
          • 2010-09-22
          相关资源
          最近更新 更多