【问题标题】:How to sample rows in MySQL using RAND(seed)?如何使用 RAND(种子)对 MySQL 中的行进行采样?
【发布时间】:2011-12-19 11:13:21
【问题描述】:

我需要使用 MySQL 从表中获取一组可重复的随机行。我使用 MySQL RAND 函数实现了这个,使用行的 bigint 主键作为种子。有趣的是,这会产生看起来一点也不随机的数字。谁能告诉我这里发生了什么以及如何让它正常工作?

select id from foo where rand(id) < 0.05 order by id desc limit 100

在一个示例中,600 行中没有返回任何行。我将选择更改为包含“id,rand(id)”,并去掉了 where 这就是我得到的 rand 子句:

| 163345 |  0.315191733944408 |
| 163343 |  0.814825518815616 |
| 163337 |  0.313726862253367 |
| 163334 |  0.563177533972242 |
| 163333 |  0.312994424545201 |
| 163329 |  0.312261986837035 |
| 163327 |  0.811895771708242 |
| 163322 |  0.560980224573035 |
| 163321 |  0.310797115145994 |
| 163319 |  0.810430896291911 |
| 163318 |  0.560247786864869 |
| 163317 |  0.310064677437828 |

看看有多少 0.31xxx 行。完全不是随机的。

PS:我知道这很慢,但在我的应用程序中,where 子句将行数限制为几 1000。

【问题讨论】:

标签: mysql random


【解决方案1】:

乘以id返回的十进制数:

select id from foo where rand() * id < 5 order by id desc limit 100

【讨论】:

    【解决方案2】:

    对所有行使用相同的种子来做到这一点,例如:

    select id from foo where rand(42) < 0.05 order by id desc limit 100
    

    请参阅rand() 文档了解它为何如此工作。如果您想要另一组值,请更改种子。

    【讨论】:

    • 这太糟糕了。我想我应该先阅读文档。我的问题是查询可能会重复运行,如果选择了一行,则必须始终选择它。所以使用常量种子是行不通的。我可能必须过滤应用程序中的行 - 效率较低,但可以工作或加入随机值表。
    • 我不明白你的问题。您可以多次运行上述查询,它会返回相同的内容(当然假设您没有更改表数据)。
    • 不幸的是,新行经常被添加到表中
    猜你喜欢
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 2014-02-24
    • 2015-01-31
    • 2023-04-09
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多