Mysql SQL为每个年龄段返回100个随机行

Mysql SQL为每个年龄段返回100个随机行,mysql,sql,random,group-by,Mysql,Sql,Random,Group By,对于每个i.Age(0-100),我希望为每个年龄返回100个随机行,其中包含所选数据。我不确定我是否应该使用while循环来完成这项任务,或者可能是一个有限制的小组?我已经看了很多不同的例子,但我仍然很困惑 SELECT, i.name, i.Gender, i.Age, i.MP, b.score FROM i INNER JOIN b on b.name=i.name WHERE i.MP='F' AND i.gender='F' AND b.score<=-1 AND i.age

对于每个i.Age(0-100),我希望为每个年龄返回100个随机行,其中包含所选数据。我不确定我是否应该使用while循环来完成这项任务,或者可能是一个有限制的小组?我已经看了很多不同的例子,但我仍然很困惑

SELECT, i.name, i.Gender, i.Age, i.MP, b.score
FROM i
INNER JOIN b on b.name=i.name
WHERE i.MP='F'
AND i.gender='F'
AND b.score<=-1
AND i.age = 0
ORDER BY RAND()
LIMIT 100
SELECT,i.name,i.Gender,i.Age,i.MP,b.score
从我
b.name=i.name上的内部联接b
i.MP='F'
和i.gender='F'

和b.score通过while循环从年龄0到100迭代,并将年龄变量传递到where子句。

您可以使用下面的用户定义变量。查询将为每个不同的年龄提供一条记录,内部查询只是检查相同的年龄,并为他们提供类似于4个相同年龄(年龄=1)的排名排名将为1,2,3,4,当年龄=2时,排名编号将再次从1开始,外部查询的where filter将筛选行,以显示where rank为1,因此对于每个不同的年龄,您将得到一行,并随机排序

SELECT  c.name, c.Gender, c.Age, c.MP, c.score
FROM (
SELECT i.name, i.Gender, i.Age, i.MP, b.score,
@r:= CASE WHEN @g = i.Age THEN @r + 1 ELSE 1 END rownum,
@g:=i.Age
FROM i
INNER JOIN b ON b.name=i.name
CROSS JOIN(SELECT @g:=NULL ,@r:=0) a
WHERE i.MP='F' AND i.gender='F' AND b.score<=-1
ORDER BY  i.Age, RAND()
) c
WHERE c.rownum = 1
ORDER BY c.Age
LIMIT 100
现在,在我的答案中使用内部查询将为您提供具有以下秩列的结果集

内部查询结果集 在上面的结果集中,你可以看到年龄=1有3行,它们的等级不同1,2,3。同样的例子年龄=2,等级为1,2,年龄=4,现在在我的回答中,外部查询将过滤掉等级=1的结果,因此最终的结果集将为每个不同的结果集包含一行,如下面的结果集所示

最终产量
随机排序部分是在内部查询中完成的,因为您可以看到order by part
order by i.Age,RAND()
它将首先以升序的方式对Age进行排序,然后对于相同的Age值,它将进一步对结果进行随机排序。希望这是有意义的

这将起作用,但101次查询非常多,并且会有很高的性能成本。(我不知道还有什么比这更好的了)谢谢你,对不起,我的问题不够清楚。我将如何修改它以返回每个年龄的100个随机行?谢谢。这将为0岁返回100个随机行,为1岁返回100个随机行,为2岁返回100个随机行,依此类推每个年龄?我还在想办法,非常感谢。我将最后3行更改为c.rownum@Mitchell yes,它将为每个行提供100个随机行user@Mitchell抱歉,在我之前的评论中是年龄而不是用户:)
name   gender  Age  Mp score
============================
test1  male    1    1   10
test2  male    1    1   10
test3  male    1    1   10
test4  male    2    1   10
test5  male    2    1   10
test6  male    3    1   10
test7  male    4    1   10
test8  male    4    1   10
.....
name   gender  Age  Mp score rank
==================================
test2  male    1    1   10    1
test1  male    1    1   10    2
test3  male    1    1   10    3
test4  male    2    1   10    1
test5  male    2    1   10    2
test6  male    3    1   10    1
test7  male    4    1   10    1
test8  male    4    1   10    2
name   gender  Age  Mp score rank
==================================
test2  male    1    1   10    1
test4  male    2    1   10    1
test6  male    3    1   10    1
test7  male    4    1   10    1