2013-03-11 86 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