2010-02-04 58 views
1

好吧......我迷路了(再次)。我怎樣才能讓一個自定義的種子蘭特(),將保留選秀權從數據庫中的特定時間段10分鐘,1小時,1天等MySQL:隨機選擇持續一段特定時間?

我用這個:

$query = 'SELECT * FROM table order by rand() LIMIT 1'; 

每次刷新頁面時都會隨機挑選。我一直在閱讀好幾天,但我找不到一個例子來解釋如何製作一個自定義的種子,以保持特定時間段的選擇。請幫助我... 嘆息

+0

事實上,你沒有從多種提案中選擇答案表明沒有人理解你想要什麼。我發現「特定時間段」和「每次刷新」都有衝突。你應該更好地描述問題。不要提你自己的「解決方案」 - 我認爲提到「定製種子」只是混淆了事情。請解釋數據庫的性質(真實應用程序或作業),隨機選擇(只是您的網頁或其他數據庫用戶)的用法,以及哪些條件觸發了另一個隨機選擇的需要。 – gary 2010-02-04 19:46:36

回答

1

正如多米尼克羅傑所說 - 蘭特秩序是可怕的。 但我發現使用cron太大的工作槍。(尤其是你不知道如何)

你還是產生在PHP中的隨機整數並存儲起來,並把它傳遞給MySQL來類似的東西:

SELECT * FROM table WHERE id=(MOD('.$php_generated_random.', LAST_INSERT_ID())+1) 

它得到一個大的隨機數量和模數,所以它不會超過表的長度。

雖然這與LAST_INSERT_ID()有問題。在很多情況下,你的mysql可能會返回0。

所以,我們要做的是,good'n'safe方式是:如果

  1. 檢查它的時間來產生新的隨機
  2. 如果是這樣,那麼得到表中最大的ID(假設有時表長度的變化)
  3. 生成的隨機數是一個id
  4. 存儲的ID和生成時間

並只做選擇其中id = $ sth

0

一旦您選擇了它,您需要將該數據存儲到會話中,並且可以將會話設置爲您指定的時間。無需每次都查詢數據庫。其次,查詢與爲指定時間設置廣告/時間無關。

+0

再次 - 不知道如何做到這一點... -newbie- – Izumi 2010-02-04 13:25:42

0

ORDER BY RAND()是一個非常糟糕的主意 - 它會殺死數據庫的性能。

這是你應該在cron工作上運行的事情,就像你想要「隨機選擇」持續的時間一樣,並存儲你隨機選擇的分鐘/小時/天的行ID。您需要注意確保該行不會被刪除。

+0

從來沒有與cron作業,所以我不知道如何做到這一點。 – Izumi 2010-02-04 13:24:19

+0

@lzumi - 去看看http://www.howtoforge.com/a-short-introduction-to-cron-jobs。 – 2010-02-04 13:30:47

0

「創建自定義種子」

我相信這個問題要你做這樣的事情:

$query = 'SELECT * FROM table order by rand (' . get_seed() . ') LIMIT 1'; 

<?php 
// return the current hour. so the seed is the same each hour 
function get_seed() { 
    return date('H'); 
} 
?> 

一個「種子」的目的是創建用於測試目的相同的隨機序列。

RAND(N)如果指定了一個常量整數參數N,那麼它將用作種子值,它會生成一個可重複的列值序列。

+0

但它只會隨機化N次,對吧?它不會持續一段時間N或.. – Izumi 2010-02-04 13:25:02

+0

在我的情況下,N是當前小時。 – Yada 2010-02-04 13:35:31

+0

這不是一個問題(創建一個種子)......這是我試圖解釋我認爲我需要的東西......你已經發布它的方式,它會保持選擇一小時,然後更改爲新的? – Izumi 2010-02-04 13:59:38

1

您可以創建一個臨時表:

SELECT * INTO #temp FROM table ORDER BY rand() LIMIT 1 

然後查詢臨時表來顯示數據。超時後刪除/重新創建表。

1

如果您正在使用PHP,您可以製作一個算法,該算法會生成一個隨機數(使用rand()),然後將該數字保存在數據庫或文件的某個位置。然後檢查當前日期和隨機數的生成日期。計算差異並使用if語句來確定是否需要再次生成隨機數。下面是一些僞代碼(注意,按日期我的意思是時間戳或Unix時間):

$gendate = getGenerationDateFromDB(); 
$now = getCurrentDate() 
if(getDifference($gendate, $now) > [time interval]) then 
    $randnum = generateRandNumber(); 
    saveRandNumberInDB($randnum); 
    saveGenDate(); 
else 
    $randnum = getRandNumberFromDB(); 
1

我對這個概念的想法,而不是一個正式的解決辦法:在向下取整,

使用md5()UNIX_TIMESTAMP()/60。在表中有許多記錄,讓它爲X.計算md5()中的數字,讓它爲Y.計算Y % X,讓它爲Z.在SQL的末尾使用limit 1 offset Z

+0

您可以使用整個md5總和的最後一些十六進制數字。 – Notinlist 2010-02-04 13:30:54

+0

我不太明白......從未聽說過md5 ...... – Izumi 2010-02-04 13:31:34

+0

md5是一種半獨特的校驗和功能。像CRC一樣。它用於標記/驗證ISO映像。 http://en.wikipedia.org/wiki/MD5它從任何字符串生成諸如'd41d8cd98f00b204e9800998ecf8427e'的東西。非常混亂。 – Notinlist 2010-02-04 13:42:58