特定の数の行をランダム化しようとしていますが、データベースには4行しかなく、6つのランダムな行を取得する必要があるとしましょう(テーブルに6行以上ある場合でも)重複を生成する可能性が必要です行。
これは mySQL で簡単に達成できますか?
私の現在のクエリは次のようなものです:
SELECT * FROM winners ORDER BY RAND() LIMIT 6
アイデアは、ユーザーが複数回勝つことができるということです。:)
あなたが助けてくれることを願っています! !
ORDER BY RAND()インデックスを使用できず、基本的にテーブル全体 (非常に大きくなる可能性があります) を 1 つの行を選択するためだけに並べ替えます。
より良い解決策には、MIN(id) と MAX(id) の間の乱数の生成が含まれ、それが選択したランダムな行です。テーブルが大きくなるにつれて、これはますます大きな利点になります。
ランダム ID を選択する方がはるかに効率的であるため、一度に 6 つのランダム ID を 1 つずつ選択し、それらの行を 1 つずつ検索することをお勧めします。したがって、特定の行を複数回選択する可能性があります。
すべての ID が連続していることが保証されていない場合は、ランダム ピックよりも大きい最初の ID を選択できます。したがって、擬似コードでは:
$MIN, $MAX = SELECT MIN(ID), MAX(ID) FROM winners
FOR LOOP FROM 1 to 6
$R = $MIN+RANDOM($MAX-$MIN)
$WINNER[] = SELECT * FROM winners WHERE id >= $R LIMIT 1
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
UNION ALL
SELECT * FROM winners ORDER BY RAND() LIMIT 1
この質問は、XY 問題の可能性があるように思えます。自分の問題ではなく、問題の解決策について尋ねているように思えます。参照: https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem
重複する行を選択するよりも、アプリケーションで 4 行を 6 行にしたほうがよいのではないかと思います。