2

特定の数の行をランダム化しようとしていますが、データベースには4行しかなく、6つのランダムな行を取得する必要があるとしましょう(テーブルに6行以上ある場合でも)重複を生成する可能性が必要です行。

これは mySQL で簡単に達成できますか?

私の現在のクエリは次のようなものです:

SELECT * FROM winners ORDER BY RAND() LIMIT 6

アイデアは、ユーザーが複数回勝つことができるということです。:)

あなたが助けてくれることを願っています! !

4

4 に答える 4

3

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
于 2013-11-04T19:25:53.180 に答える
2
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
于 2013-11-04T17:51:25.270 に答える
0

この質問は、XY 問題の可能性があるように思えます。自分の問題ではなく、問題の解決策について尋ねているように思えます。参照: https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem

重複する行を選択するよりも、アプリケーションで 4 行を 6 行にしたほうがよいのではないかと思います。

于 2013-11-04T17:54:46.807 に答える