select .. from (
Select ... from ... order by weight desc limit N
) order by rand() limit 1
上記は毎回一時テーブルを作成する必要があり、効率的ではないため、資格がありません。
適切に行う方法は?
select .. from (
Select ... from ... order by weight desc limit N
) order by rand() limit 1
上記は毎回一時テーブルを作成する必要があり、効率的ではないため、資格がありません。
適切に行う方法は?
私の理解が正しければ、乱数Rth
である順序付けられた結果セットの行が必要です。R
もしそうなら、2つのパラメータを持つ LIMIT オプションがあなたが望むものであるようです。最初のパラメーターは、次の乱数にすることができます1 to N
。
SELECT ... order by weight desc limit R,1
MySQL がインストールされていないため、テストできません。したがって、R が RAND() を直接使用できるかどうか、または事前に計算する必要があるかどうかはわかりません。
あなたは一見する必要があります:
http://akinas.com/pages/en/blog/mysql_random_row/
テーブルスキャンを回避しながらこれを実装するためのいくつかの提案があります。
SELECT * FROM `table` WHERE id >= (
SELECT FLOOR( MAX(id) * RAND()) FROM `table`
) ORDER BY id LIMIT 1;