2

假设有一个包含 1000 个条目的表。我们想选择一个介于 1 到 1000 之间的随机数,并返回 id 大于或等于该值的所有行。输入静态值时,它似乎工作得很好。例如

Select * From myTable
Where id >= 500
Order by id Limit 10;

这将返回 500 到 509 的预期值。但是,一旦我尝试用随机生成的值替换 500 的固定值,事情就变得非常奇怪。

Select * From myTable
Where id >= floor(1 + RAND() * (1000 - 1))
Order by id Limit 10;

突然,它不再返回顺序值。返回的值也非常偏向低端。我得到这样的结果:

65, 80, 96, 98, 112, 114, 115, 116, 130, 131

为什么会这样?

4

3 回答 3

2

这就是为什么你的随机变化....

  mysql> select id,rand() from test_big;
    +-------------+----------------------+
    | id          | rand()               |
    +-------------+----------------------+
    |          10 |   0.9478371384999129 |
    |          11 | 0.024267499357711057 |
    |   123456789 |   0.2778261120224615 |
    |  1234567890 |   0.3163280927728192 |
    | 12345678901 |   0.7481621585303565 |
    +-------------+----------------------+
    5 rows in set (0.00 sec)

对每一行执行随机数.....但是您可以使用变量来解决您的问题....

mysql> set @random:= rand();
Query OK, 0 rows affected (0.00 sec)

mysql> select @random;
+--------------------+
| @random            |
+--------------------+
| 0.7918265450669699 |
+--------------------+
1 row in set (0.00 sec)

mysql> select id,@random:=@random+1 from test_big;
+-------------+--------------------+
| id          | @random:=@random+1 |
+-------------+--------------------+
|          10 |   1.79182654506697 |
|          11 | 2.7918265450669697 |
|   123456789 | 3.7918265450669697 |
|  1234567890 |   4.79182654506697 |
| 12345678901 |   5.79182654506697 |
+-------------+--------------------+
5 rows in set (0.00 sec)

在你的情况下

set @random:=floor(1 + RAND() * (1000 - 1));

在选择功能之前

于 2012-06-07T20:03:08.390 回答
0

子句中的随机数WHERE是针对每一行单独计算的。因此,您没有一个随机数来过滤您的结果,而是 1000 个随机数 - 每个条目一个。

于 2012-06-07T19:59:18.270 回答
0

因为 where 子句中的随机函数每次都会被评估,因此每次都会生成一个新的随机数。

于 2012-06-07T19:59:34.787 回答