我试图根据其排名从一个表中获取随机行集。
具体来说,我想从池(表)中半随机选择玩家(行)来创建团队。每个球员的排名从0到100.球队从队列中随机挑选(例如,来自前20%的6名随机球员,来自前60%的8名随机球员,以及来自前100%的6名球员)
我尝试过使用union,但计算时间对于添加的每个union语句都会线性增加。 (池是查询的结果集)
除了工会之外,还有其他方法吗?
答案 0 :(得分:1)
为什么不将生成的列用于表示玩家所在的频段,然后根据该频段进行排名。
逻辑本身:
IF PLAYER_RANK < 20
PLAYER_BAND = 1
ELSE IF PLAYER_RANK < 60
PLAYER_BAND = 2
ELSE
PLAYER_BAND = 3
现在您已经将玩家绑定,然后您可以在该BAND上进行排名。这将为您提供乐队中每个玩家的递增值。我可能在整体排名第50位,但我在第2顺位排名第30位
然后你可以在where子句中进行过滤
WHERE PLAYER_BAND = 1 and BAND_RANK <= 6 ....
这会将你的结果限制为你想要的,每个乐队的X人。不需要联合,也许可以选择使外部选择更简单。
更新:
尝试这样的事情。
SET @prevBand := null;
SET @rank := 0;
select
*
from
(select
ranking,
user,
band,
random,
IF(@prevBand <> band, @rank:=1, @rank:=@rank + 1) as 'band_ranking',
@prevBand:=band
from
(SELECT
ranking,
CASE
WHEN ranking < 2 THEN 1
WHEN ranking <= 4 THEN 2
ELSE 3
END as 'band',
user,
rand() as 'random'
FROM
queries
order by random) players order by band) player_ranks
where
(band = 1 && band_ranking <= 1)
|| (band = 2 && band_ranking <= 1)
|| (band = 3 && band_ranking <= 2);