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));

select 関数の前に

于 2012-06-07T20:03:08.390 に答える
0

節内の乱数は、WHERE行ごとに個別に計算されます。したがって、結果をフィルタリングするための乱数は 1 つではなく、1000 個の乱数 (エントリごとに 1 つ) です。

于 2012-06-07T19:59:18.270 に答える
0

where句のランダム関数は毎回評価されるため、毎回新しい乱数が生成されます。

于 2012-06-07T19:59:34.787 に答える