Why don't you make a generated column to represent what band a player is in, and then do a rank based on that band also.
logic as such:
IF PLAYER_RANK < 20
PLAYER_BAND = 1
ELSE IF PLAYER_RANK < 60
PLAYER_BAND = 2
ELSE
PLAYER_BAND = 3
Now that you have the player banded, you can then do a RANK on that BAND. That would give you an incrementing value for each player in the band. I may be Player Rank 50 overall, but I would be Rank 30 in Band 2
You can then in a where clause do your filtering
WHERE PLAYER_BAND = 1 and BAND_RANK <= 6 ....
That would limit your results to what you want, X people from each band. No union needed, maybe subselect to make the outer select simpler.
UPDATE:
Try something like this out.
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);