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

时间:2014-09-23 04:48:30

标签: 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 = 0
ORDER BY RAND()
LIMIT 100

目前上述查询有效,但它只返回100个0岁的随机行。我已经看了几个例子,但无法判断我是应该使用group by还是while while循环。表中有超过10,000,000行。

2 个答案:

答案 0 :(得分:2)

你可以使用下面用户定义的变量查询将为每个不同的年龄提供一条记录,内部查询只是检查相同的年龄并给它们排名,就像4个相同的年龄(年龄= 1)等级将是1, 2,3,4当年龄= 2时,等级数将再次从1开始,其中外部查询的过滤器过滤行以显示等级为1的位置,因此对于每个不同的年龄,您将获得一行并且它们是随机排序的< / p>

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

假设您的加入查询为您提供结果

样本数据集

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

如上面的结果集,你可以看到年龄= 1有3行,他们的等级是不同的1,2,3同样的例子对于年龄= 2等级是1,2相同的年龄= 4,现在在我的答案中外部查询将过滤掉rank = 1的结果,因此最终结果集将包含每行不同的行,如下面的结果集

最终输出

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

随机排序部分在内部查询中完成,因为您可以按部分ORDER BY i.Age, RAND()查看订单,它将首先按升序方式对年龄进行排序,然后对于相同的年龄值,它将进一步随机排序结果。希望它有道理

答案 1 :(得分:0)

从Age 0到100循环迭代,并将Age变量传递给where子句。