2012-04-01 56 views
5

我正在尋找一種創建協作翻譯小部件的方式。所以我有一個mysql數據庫和表(稱爲翻譯),以及一個允許用戶一次翻譯一頁的小腳本。從mysql查詢中打印一個隨機行

但我不太相信我的腳本。我認爲它不夠高效。首先,mysql獲取所有具有空'en'列的行,然後通過屏幕顯示一個單獨的行。有沒有其他的方式來做到這一點?這是代碼:

//Retrieve all the data from the "translations" table 
$result = mysql_query("SELECT * FROM translations WHERE en IS NULL OR en=''") or die(mysql_error()); 

$Randnum=rand(0,mysql_num_rows($result)-1); //Gets a random number between 0 and the maximum number of rows 
$i=0; //Start to 0 
while($Col = mysql_fetch_array($result)) //While there are rows to evaluate 
    { 
    if ($i==$Randnum) 
     { 
     echo "\"".$Col['es']."\"<br><br>Translate it to English: <br>"; 
     } 
    $i++; 
    } 

我一直在尋找像 「回聲$山口[$ Randnum] [ '上課']」 或 「回聲$ $上校Randnum [ '上課']」,而不是使用整個while循環打印一個隨機行。我怎樣才能實現這個?如果這只是一個優化問題。如果您可以附帶腳本或想法將一行隨機數字和空白的'en'col分配給$ Col,那會更好! (我認爲這是不可能的)。 'en'行是文本,所以我不知道如何執行other methods我已經看到,因爲它們在ORDER BY中使用數字。

回答

7

您可以在查詢中使用ORDER BY RAND() LIMIT 1從數據庫中提取一個隨機行。

+0

+1是第一個,雖然它的'RAND()':) – 2012-04-01 19:16:08

+0

將它甚至與文字工作嗎?即使它工作,它不會選擇第一個ASCII爲rand()所表示的文本嗎? (例如,如果許多行以'H'開頭,它是不是每次只選擇第一個rand()爲72的行?) – 2012-04-01 19:17:43

+0

@FrankPresenciaFandos:它與表中的數據完全無關。它在內部爲每一行生成一個隨機數,然後按該數字進行排序。 – ThiefMaster 2012-04-01 19:18:33

2

讓它在查詢側

SELECT * FROM translations WHERE en IS NULL OR en='' ORDER BY rand() LIMIT 0,1 
1

有這樣做的幾種方法。

@ ThiefMaster的答案會奏效 - 但「rand by(order by rand)」在大型表格上有相當大的性能問題。所以,我會用您希望能夠增長的大小的樣本數據填充您的表格,然後測試性能。如果這不是問題,請保持原樣 - 過早優化是所有邪惡的根源!有一些alternatives;他們依靠運行兩個單獨的查詢;不過,假設你有指數,這應該不成問題。

返工您scenarion,這成爲:

mysql_query('SELECT @count := COUNT(*) FROM translations WHERE en IS NULL OR en='''); 
mysql_query('SET @offset = CONVERT(FLOOR(RAND() * @count), SIGNED)'); 
mysql_query('PREPARE mystatement FROM "SELECT * FROM translations WHERE en IS NULL OR en='' LIMIT ?, 1"'); 
$res = mysql_query('EXECUTE mystatement USING @offset'); 
$row = mysql_fetch_assoc($res); 
print_r($row); 
+0

我不希望這張表在將來增長到超過2000/3000行,但感謝您擴展信息。我也喜歡引用「過早優化是萬惡之源」。 – 2012-04-01 19:27:45

+0

這不是我的 - 有人指出,把「過早」置於幾乎任何事物的前面都會讓它聽起來很糟糕...... – 2012-04-01 19:29:11

+0

對不起,我的意思是,感謝引用我閱讀很多不同的有趣內容的報價互聯網 (; – 2012-04-01 20:25:46