mysqlランダムデータの取得方法

1079 ワード

1.order by rand()データが多くなるのは極めて遅く、ランダム性が非常に良く、非常に小さなデータ量の場合に適しています.
 
  
SELECT * FROM table_name AS r1 JOIN (SELECT (ROUND(RAND() * (SELECT ABS(MAX(id)-MIN(id)-$limit) FROM table_name))+(SELECT MIN(id) from table_name)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT $limit;

速度は非常に速いが、得られたデータはid連続で解決できない.
サブクエリは乱数を生成します.
rand()は0から1の乱数であり、0から1に等しいことができる.
MAX(id)-MIN(id)は、結果が$limitバーに満たないように$limitを減算します.
メインテーブルidが不連続である可能性があるため、r 1.id要>=r 2.id
なお、最小idは1からではなく、大きな数から始まる場合があるので、M(id)の値を付けなければなりません
マニュアル関連内容:i≦R≦jの範囲でランダム整数Rを得るには、式FLOOR(i+RAND()*(j�C i+1)を使用する必要があります.
たとえば、7~12の範囲(7~12を含む)でランダムな整数を取得するには、次の文を使用します.
 
  
SELECT FLOOR(7 + (RAND() * 6));
select * from test where rand()>0.0005 limit 10;
 

0.0005は、計算された割合がランダムな品質に直接関係します.例えば、データテーブル10000個のデータをランダムに300個取る必要がある場合、0.0005は(300/1000=0.03)に変更する必要があります.この方法では毎回どれだけ取れるか保証できず、何度も取る必要があります.2は3と同じ速度で、主な違いは2が常にlimitバーのデータを返すことができて、3は正確ではありません(正太分布に合致します).2は連続データ、3はランダム行です.