【问题标题】:SQL return 100 random rows for each ageSQL 为每个年龄返回 100 个随机行
【发布时间】:2014-11-17 04:28:51
【问题描述】:

对于每个 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 循环。表中有超过 10,000,000 行。

【问题讨论】:

    标签: mysql sql random group-by


    【解决方案1】:

    您可以在查询下方使用用户定义的变量,每个不同年龄都会为您提供一条记录,内部查询只是检查相同年龄并为它们提供排名,就像 4 个相同年龄(年龄 = 1)排名将为 1, 2,3,4 并且当年龄 =2 时,排名号将再次从 1 开始,并且外部查询的过滤器正在过滤行以显示排名为 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
    

    假设您的联合查询给您的结果为

    样本数据集

    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 的相同示例对于年龄 = 4 等级是 1,2 相同,现在在我的回答中外部查询将过滤掉 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() 它会首先以升序方式对年龄进行排序,然后对于相同的年龄值,它将进一步随机排序结果。希望它有意义

    【讨论】:

    • 谢谢你,对不起,我的问题不够清楚。我将如何修改它以为每个年龄返回 100 个随机行?
    • 谢谢。所以这将为年龄 0 返回 100 个随机行,为年龄 1 返回 100 个随机行,为年龄 2 返回 100 个随机行,等等每个年龄?我仍在努力解决它。
    • 非常感谢。我将最后 3 行更改为 WHERE c.rownum
    • @Mitchell 是的,它会为每个用户提供 100 个随机行
    • @Mitchell 抱歉,在我之前的评论中是年龄而不是用户 :)
    【解决方案2】:

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

    【讨论】:

    • 这会起作用,但 101 次查询很多并且会产生很高的性能成本。 (虽然我不知道更好)
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多