0

私は MySQL テーブルを持っており、playersすべてのプレーヤーを n グループ (n>=2) にランダムに配置しようとしています。各グループのサイズは決まっていますが、可変です。

時間の例:

テーブルの 10.000 行playersを 3 つのグループに分けます。グループ A には 5.000 人のプレーヤーが含まれ、グループ B には 3.000 人のプレーヤーが含まれ、グループ C には 2.000 人のプレーヤーが含まれます。

別の例は次のとおりです。

テーブルの 10.000 行playersを 4 つのグループに分けます。グループ A には 3.000 人のプレーヤーが含まれ、グループ B には 3.000 人のプレーヤーが含まれ、グループ C には 2.000 人のプレーヤーが含まれ、グループ D には 2.000 人のプレーヤーが含まれます。

今私の質問:
PHP または MySQL でこれを行う必要がありますか? (おそらくMySQLの方が速いと思ってい
ました)行ごとに乱数を生成し、それによって行を並べ替えてから、OFFSETとLIMITを使用して行を選択するよりも、MySQLでこれを行うためのより良い(より効率的な)方法はありますか?

4

2 に答える 2

0

これを行う最も効率的で簡単な方法は、次のクエリを実行することだと思います。

SELECT * FROM players
ORDER BY rand()

そして、2 つの PHP FOR ループ (グループごとに 1 つ) で結果を反復処理します。

この方法では、1 つのクエリのみを実行し、結果を 1 回反復処理します (これはとにかく実際に行う必要があることです)。

于 2013-09-03T00:00:01.047 に答える
0

これは MySQL で実行できます。戦略は次のとおりです。行をランダム化して列挙します。次に、各グループの列挙のブレークを計算します。

select t.*,
       (case when (seqnum - 1) / totalcnt < 0.3 then 'GroupA'
             when (seqnum - 1) / totalcnt < 0.6 then 'GroupB'
             when (seqnum - 1) / totalcnt < 0.8 then 'GroupC'
             else 'GroupD'
        end) as WhichGroup
from (select t.*, @rn := @rn + 1 as seqnum, totalcnt
      from t cross join
           (select @rn := 0, count(*) as totalcnt from t) const
      order by rand()
     ) t;

order by rand()物事を遅くします。ただし、ランダム サンプルの取得は本質的に高速なプロセスではありません。

探しているものとはわずかに異なるサイズのグループを作成するより高速な方法は、次のことです。

select t.*,
       (case when rand() < 0.3 then 'GroupA'
             when rand() < 0.6 then 'GroupB'
             when rand() < 0.8 then 'GroupC'
             else 'GroupD'
        end) as WhichGroup
from t;
于 2013-09-03T00:54:32.157 に答える