SQL クエリの結果からランダムな行を取得しようとしています。
私のクエリは次のとおりです
SET @rank = 0;
SELECT * FROM(
SELECT (@rank:=@rank+1) AS num, ...
FROM ...
WHERE ....) as raw
WHERE raw.num = FLOOR(1 + (RAND() * @rank)) LIMIT 1
一般的な考え方は、内部クエリ結果からのテーブルの各行に一意の番号 (num) が与えられるということです。これが実際に当てはまり、すべての行に番号が付けられていることを手動で確認しました。
最後の行は私を苦しめています。現状では、WHERE num = FLOOR(1 + (RAND() * @rank)) LIMIT 1
私が望むものを返しています-半分の時間しかありません。正しい範囲内のランダムな行を返しているようです (クエリをテストしている例では、0 ~ 1299 です)。ただし、3 回に 1 回のクエリではまったく何も返されません。
わかりましたので、おそらく倍精度の問題だと思ったので、>=
次のように使用してみました: WHERE num >= FLOOR(1 + (RAND() * @rank)) LIMIT 1
. この場合の結果は私を混乱させます。このコードでは常に結果が得られますが、返される行数は常に < 100 です。
したがって、 FLOOR(1 + (RAND() * @rank)) を呼び出すとしますx
。を使用する=
と、(場合によっては) 1000 より大きい数値に等しくなければならない>=
ことが確認されます。x
>=
どうしたの?または、他にどのように問題を解決できますか