簡體   English   中英

在MySQL中為n個組選擇隨機子集

[英]Select random subset for n groups in MySQL

我有一個MySQL表players ,我試圖將所有播放器隨機分組為n個組(n> = 2),每個組具有確定的但可變的大小。

時間示例:

將桌上players的10.000行放入3個組,其中A組包含5.000個玩家,B組包含3.000個玩家,C組包含2.000個玩家。

另一個示例可能是:

將來自表players的10.000行放入4個組,其中A組包含3.000個玩家,B組包含3.000個玩家,C組包含2.000個玩家,D組包含2.000個玩家。

現在我的問題是:
我應該在PHP或MySQL中執行此操作嗎? (我當時以為MySQL可能會更快)
在MySQL中,有沒有比在每一行中生成隨機數並按行排序然后使用OFFSET和LIMIT選擇行更好(更有效)的方法?

我認為最有效,最簡單的方法是運行以下查詢:

SELECT * FROM players
ORDER BY rand()

然后在幾個PHP FOR循環(每個組一個)中遍歷結果。

這樣,您將只運行一個查詢,並對結果進行一次迭代(無論如何,這實際上是您要做的事情)。

您可以在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()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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM