2013-03-11 63 views
0

以下是一些研究,我发现了一个适合我需求的查询:它随机地从表中返回ID。 ID字段是一个自动增量,所以没有漏洞。去重复智能随机行查询?

SELECT `mydb`.`myTable`.id 
FROM (SELECT Floor (Rand() * (SELECT Count(*) 
           FROM `mydb`.`myTable`)) num, 
       @num := @num + 1 
     FROM (SELECT @num := 0) a, 
       `mydb`.`myTable` 
     LIMIT 2000000) b, 
     `mydb`.`myTable` 
WHERE b.num = `mydb`.`myTable`.id 

我遇到的问题是目标表(myTable)包含30-400M记录,具体取决于具体情况。在LIMIT中,我想检索2M个随机选择的ID,但是我得到了很多重复项(这是预期的)。

是否有可能取消重复查询,但仍然收到2M记录?我想创建一个表并让它管理UNIQUE值,但是我会再次得到比预期的更少的值。

有什么想法?非常感谢!

+0

只是一个快速的想法 - >用随机值动态创建列来扩展您的表,并从该列中排序的TOP中取2M。 – MarcinJuraszek 2013-03-11 22:09:08

+0

将“限制”放在子查询外部 – Barranka 2013-03-11 22:09:31

+0

只需注意自动增量不能保证没有“漏洞”。行可以被删除,在ID字段留下空白。 – SomeSillyName 2013-03-11 22:16:38

回答

1

您可以简单地随机排列您的行。比没有重复,如果你有漏洞没有关系。

SELECT 
    id 
FROM 
    mydb.myTable 
ORDER BY 
    RAND() 
LIMIT 2000000