[英]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.