2010-01-05 91 views
1

確定我有這個疑問,給了我DISTINCT product_series,再加上表中的所有其他領域:爲什麼添加的RAND()會導致MySQL超載?

SELECT pi.* 
FROM (
     SELECT DISTINCT product_series 
     FROM cart_product 
     ) pd 
JOIN cart_product pi 
ON  pi.product_id = 
     (
     SELECT product_id 
     FROM cart_product po 
     WHERE product_brand = "everlon" 
       AND product_type = "'.$type.'" 
       AND product_available = "yes" 
       AND product_price_contact = "no" 
       AND product_series != "" 
       AND po.product_series = pd.product_series 
     ORDER BY product_price 
     LIMIT 1 
     ) ORDER BY product_price 

這工作得很好。我也按價格訂購,所以我可以得到每個系列的起始價格。尼斯。

但是今天我的老闆告訴我,這就是所有從該查詢顯示出來的產品是metal_type白金他要展示隨機金屬類型。所以我加了RAND()的順序由ORDER BY後的價格讓我仍然會得到最低的價格,但價格最低的隨機金屬..這裏是新的查詢:

SELECT pi.* 
FROM (
     SELECT DISTINCT product_series 
     FROM cart_product 
     ) pd 
JOIN cart_product pi 
ON  pi.product_id = 
     (
     SELECT product_id 
     FROM cart_product po 
     WHERE product_brand = "everlon" 
       AND product_type = "'.$type.'" 
       AND product_available = "yes" 
       AND product_price_contact = "no" 
       AND product_series != "" 
       AND po.product_series = pd.product_series 
     ORDER BY product_price, RAND() 
     LIMIT 1 
     ) ORDER BY product_price, RAND() 

當我運行這個查詢,MySQL完全關閉,並告訴我,有太多的連接而我從主機管理員得到一個電話,問我到底做了什麼。

我不相信這可能只是從添加RAND()到查詢,我認爲這必須是巧合。在所有事情都解決之後,我等了幾個小時,然後再次運行查詢。立即......同樣的問題。

那麼是怎麼回事?因爲我不知道。我的查詢有問題嗎?

謝謝!

+2

不會對您問題的解決方案,但你真的應該使用的查詢參數不是字符串連接。 – 2010-01-05 21:05:03

+0

@Mark,你可以給我或者鏈接我一個例子嗎?謝謝。 – 2010-01-05 21:06:55

+2

@John:http:// stackoverflow。com/questions/60174/best-way-to-stop-sql -injection-in-php – 2010-01-05 21:09:48

回答

1

使用RAND()的ORDER BY是不是一個好主意,因爲它不適合作爲數據的增加。你可以在我的回答this question中看到更多關於它的信息,包括你可以適應的兩種選擇。

1

這裏有一個博客文章,解釋這個問題非常好,和解決辦法:

http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

下面是對ORDER BY RAND()了類似的警告對MySQL,我覺得原因基本上有相同的:

http://www.webtrenches.com/post.cfm/avoid-rand-in-mysql

+0

這是另一個博客,有各種解決方案: http://jan.kneschke.de/projects/mysql/order-by -rand / – 2010-01-05 21:05:30

0

根據您網站中產品的數量,該函數調用將在每個記錄中執行一次,可能會降低查詢速度。

太多連接錯誤可能是由於此查詢在嘗試計算這些數字時阻止其他人。

找到另一種方法。 ;)

0

相反,你可以在你使用的編程語言產生隨機數,而不是MySQL的一面,rand()被要求每行

0

如果你知道你有多少記錄都可以選擇這樣的隨機記錄(這是Perl的):

$handle->Sql("SELECT COUNT(0) AS nor FROM table"); 
$handle->FetchRow(); 
$nor = $handle->Data('nor'); 
$rand = int(rand()*$nor)+1; 
$handle->Sql("SELECT * FROM table LIMIT $rand,1"); 
$handle->FetchRow(); 
. 
. 
. 
相關問題