Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从一个表中选择多行_Mysql_Sql - Fatal编程技术网

Mysql 从一个表中选择多行

Mysql 从一个表中选择多行,mysql,sql,Mysql,Sql,我试图从一个表中根据其排名获得随机的行集 具体来说,我想半随机地从一个池(表)中选择玩家(行)来创建一个团队。每个玩家的排名从0到100。球队是从一组队伍中随机挑选的(例如,前20名中随机挑选6名球员,前60名中随机挑选8名球员,前100名中随机挑选6名球员) 我尝试过使用union,但每次添加union语句,计算时间都会线性增加。(池是查询的结果集) 除了联盟,我还应该采取其他方法吗?为什么不创建一个生成的列来表示球员所在的乐队,然后根据该乐队进行排名呢 这样的逻辑: IF PLAYER_RA

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

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

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


除了联盟,我还应该采取其他方法吗?

为什么不创建一个生成的列来表示球员所在的乐队,然后根据该乐队进行排名呢

这样的逻辑:

IF PLAYER_RANK < 20
  PLAYER_BAND = 1
ELSE IF PLAYER_RANK < 60
  PLAYER_BAND = 2
ELSE
  PLAYER_BAND = 3
如果玩家排名<20
播放器\u波段=1
否则,如果玩家等级<60
播放器\u波段=2
其他的
播放器\u波段=3
现在你有了玩家的乐队,你就可以在乐队里排名了。这将为乐队中的每个球员提供一个递增的值。我可能是总排名50的球员,但我会在2级排名30

然后可以在where子句中执行筛选

WHERE PLAYER_BAND = 1 and BAND_RANK <= 6 ....

当PLAYER_BAND=1和BAND_排名时,为什么要区分不同的范围(前20%、前60%、前100%)?你希望它是随机的。这里有一些关于选择随机行的方法。使用
联合
,但也涉及在特定类或分组中进行选择。@FabianBigler是!它确实减少了随机性。简言之,我正试图组建一支导师学员团队。我添加了随机性,这样玩家在下一轮中被分配到同一个团队或团队成员的机会就更少了。作为补充说明,我知道您在查询中询问如何做到这一点,但如果您要创建多个团队,则将玩家和排名列表转储到一个数组中并用代码完成所有团队创建工作可能会更快。这样,您只需执行一个查询,并且可能更容易在多个团队中不选择同一名球员。随机化在哪里发挥作用?主要集中在让乐队在乐队中排名。随机性可以通过为每个记录生成一个随机值来实现,并对银行的排名进行排序“随机性可以通过”…你能在回答中给出一个例子吗?这并不意味着你错了,它只是对OP问题的一个更完整的答案,如果它包含(我将要考虑的)问题的关键部分。添加SQL来做随机性和显带和绑扎等级。
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);