2014-01-24 28 views
0

好的,所以我有一個值列表,我想它,所以用戶可以選擇任何7個不同的選項,它會隨機選擇x使用任何這些選項從表格中得到的數值。最有效的方式隨機選擇任何MySQL值賦予多個值,以匹配它

結構像
ImgID(唯一鍵)| SiteID |其他表格

嘗試1: 我嘗試的第一種方法是讀取數據庫中的任何選定值,並計算每個選定選項的數量。發生的數量被存儲在一個變量中(只是將其稱爲num),並且也計算總量。然後它選擇一個介於1和最大金額之間的隨機數,用單個金額運行num變量,將其遞增,直到它超過該值,揭示隨機值落入哪個選項值。這可以正確地隨機選擇選項,但它仍然需要從數據庫中進行另一次隨機選擇,這會導致下一次嘗試。

嘗試2: 從數據庫中的隨機值看起來很合理,但我想爲什麼不是一次全部做,而是跳過很多查詢。雖然我似乎無法正常工作,但我正在使用此網站 - http://akinas.com/pages/en/blog/mysql_random_row/並選擇了使用的底部方法。有此相當一些錯誤信息 - 「無法保存結果集」,「執行被打斷」,「丟失的連接到MySQL服務器」和「不是一個合法的結果資源」

的代碼是

for($i=0;$i<count($sites)-1;$i++){ 
    $siteinfo = explode("@",$sites[$i]); 
    $siteid = $siteinfo[0]; 
    $sitegroup = $siteinfo[1]; 
    if($i!=0){ 
     $sqlextra .= " OR "; 
    } 
    $sqlextra .= "SiteID='".$siteid."'"; 
} 
$sql="SELECT * FROM ImageList WHERE ImgID >= (SELECT FLOOR(MAX(ImgID) * RAND()) FROM 
ImageList) AND Valid='1' AND (".$sqlextra.") ORDER BY ImgID LIMIT 1"; 
if(mysql_query($sql, $mysql_connect)){} 
else{echo mysql_error();} 

而且有幾個選擇的選項的SQL輸出爲

SELECT * FROM ImageList WHERE ImgID >= (SELECT FLOOR(MAX(ImgID) * RAND()) FROM ImageList) AND Valid='1' AND (SiteID='6' OR SiteID='7') ORDER BY ImgID LIMIT 1 

我不是很擅長的MySQL所以不知道,如果我錯了地方,但如果任何人有這樣做的更好的辦法或者只是知道爲什麼我的不工作,這將不勝感激,歡呼聲

回答

1
select * from ImageList where Valid='1' AND (SiteID='6' OR SiteID='7') order by RAND() Limit 1 

這應該是很多更有效的:)

+0

'ORDER BY RAND()'不應該被認爲是有效的 - 它真的不是,請閱讀鏈接到OP比如文章:HTTP ://akinas.com/pages/en/blog/mysql_random_row/ – CD001

+0

啊謝謝你,完美的作品:)編輯:哦,它似乎工作在約1秒,但有9000個值,所以是有點慢或好的? – Peter