2011-02-11 75 views
2

我有一個表「masterurls」它有超過一百萬條記錄。每次執行查詢時,我都想獲取隨機記錄。它不應該有以前執行中獲取的任何記錄。我已經有這個疑問:如何在每次執行SQL查詢時選擇隨機唯一記錄

SELECT m.url FROM masterurls ORDER BY RAND() LIMIT 200

的問題是上面的查詢只返回前200百分的記錄,每次隨機化它。

+1

`m`沒有被定義。和哪種編程語言? – Starx 2011-02-11 06:25:49

回答

1

既然你可以通過種子參數來RAND()功能,你可以在「分頁」通過生成第一頁之前種子的隨機結果。

示例代碼: 第一頁(因語言而異):

int seed = Math.abs(new Random().nextInt()); 

SQL查詢:

SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200; 

商店種子某處(基於Web的應用程序,你可以使用一個url參數或會話)。 在接下來的頁面:

SELECT url FROM masterurls ORDER BY RAND({seed}) LIMIT 200 * {pageNumber}, 200; 

注:RAND()排序是一項繁重的操作,你可能會更好存儲與URL的哈希碼一個索引列,然後使用一個基於模塊或其他隨機函數。

1

你如何知道url是否已經被訪問過。我最好的建議是在表格中設置一個標誌來知道這一點。在表格中添加一個類似於視圖的字段,該字段將接受兩個值1或0,1表示已訪問,0表示未訪問。然後,你可以使用

SELECT m.url FROM masterurls m WHERE view='1' ORDER BY RAND() LIMIT 200; 
+0

如何將他們更新到`view = 1` **時訪問第二組行**?我建議 - 基於這個答案,這個答案一次只能用一個查看器 - 列值爲0 1或2,現在可以查看0 =。 1 =查看現在和2 =查看。運行'UPDATE SET view = 1 WHERE view = 0 ORDER BY RAND()LIMIT 200`,然後選擇200行(`SELECT WHERE view = 1`),最後執行`UPDATE SET view = 2 WHERE view = 1` 。 – 2011-02-11 06:36:35

+0

我只寫了查詢來檢索記錄,而不是更新。我正在考慮更新網頁或表單中的記錄。所以,我問了哪種編程語言,因爲我不知道只能從SQL執行此操作。 – Starx 2011-02-11 06:41:14