从一个表中选择多个行

时间:2014-02-19 19:44:42

标签: mysql sql

我试图根据其排名从一个表中获取随机行集。

具体来说,我想从池(表)中半随机选择玩家(行)来创建团队。每个球员的排名从0到100.球队从队列中随机挑选(例如,来自前20%的6名随机球员,来自前60%的8名随机球员,以及来自前100%的6名球员)

我尝试过使用union,但计算时间对于添加的每个union语句都会线性增加。 (池是查询的结果集)

除了工会之外,还有其他方法吗?

1 个答案:

答案 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);