2011-11-01 117 views
3

我需要使用MySQL从表中获取可重复的随机行集。我使用MySQL RAND函数将该行的bigint主键作为种子来实现它。有趣的是,这产生的数字看起来并不随意。任何人都可以告诉我这里发生了什么,以及如何让它正常工作?如何使用RAND(种子)在MySQL中对行进行采样?

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

在一个例子中,600行中没有一行返回。我改变选择,包括“ID,兰特(ID)”,并在摆脱兰特条款的地方,这是我得到了什么:

| 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

+0

如果再次运行相同的查询你得到了类似的结果?你还有很多0.31xxxx的吗? –

+0

是的,它每次都是相同的 –

+1

也相关:http://stackoverflow.com/questions/2405077/stable-repeatable-random-sort-mysql-rails – rogerdpack

回答

8

用数字对所有行做同样的种子,像:

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

查看rand()文档说明为什么它的工作方式。如果您想要另一组值,请更改种子。

+0

这很糟糕。猜猜我应该先阅读文档。我的问题是查询可能会重复运行,并且如果一次选择某行,必须始终选择该行。所以使用恒定种子是行不通的。我可能必须过滤应用中的行 - 效率较低,但可以工作或加入随机值表。 –

+0

我不明白你的问题。你可以多次运行上面的查询,但它会返回相同的结果(当然,假设你不改变表数据)。 – Mat

+0

不幸的是,新表经常被添加到表中 –

0

乘以ID返回的十进制数:

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