2011-07-19 121 views
1

我正在創建一個在線商店網站,需要從數據庫中選擇隨機產品的功能。從數據庫中隨機選擇一行的函數!

這個想法是,每當網頁加載時都會有一個隨機產品的廣告!

使用PHP,我該如何去做這件事?

tbl_products

ID 代碼 標題 股票 成本 RRP

這些都是我需要從數據庫訪問的行。

由於

+0

有這個尚未已經回答? http:// stackoverflow。com/questions/3624759 /最快的方式獲取隨機記錄從分區 http://stackoverflow.com/questions/211329/quick-selection-of-a-random-row-from-a -large-table-in-mysql –

回答

7

一個最簡單的解決方案會是這樣:

SELECT * 
FROM tbl_products 
ORDER BY 
     RAND() 
LIMIT 1 

然而,這隨着產品的數量增長的效率低。

該解決方案:

更有效,但它仍然需要進行全表掃描。

如果你的產品ID是分配或多或少均勻,使用此:如果你有ID之間的差距

SELECT p.* 
FROM (
     SELECT 
       (
       (
       SELECT MAX(id) 
       FROM tbl_products 
       ) - 
       (
       SELECT MIN(id) 
       FROM tbl_products 
       ) 
       ) * RAND() AS rnd 
     ) q 
JOIN tbl_products p 
ON  id >= rnd 
ORDER BY 
     id 
LIMIT 1; 

,後較大的差距,產品往往會更頻繁地選擇。

除了id之外,您可以使用一個特殊的獨特列來實現此目的,您應該在cron作業中填充而不留空隙。

+0

我會添加一個WHERE股票> 1,並且在任何時候,庫存產品的數量不會超過500.您的解決方案是否可以爲此工作? – sark9012

+0

@Luke他的解決方案應與所有工作WHERE子句 – cwallenpoole

+0

見http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random -row-from-table /想了解爲什麼這可能不是最有效的方法。 – newtron

1

ORDER BY RAND()是一個衆所周知的解決方案,具有衆所周知的問題。

如果產品ID是整數的連續範圍,有行的不平凡的數字,那麼它會好得多SELECT MAX(id) FROM products,產生1之間的數字隨機整數的,結果在PHP中,並做SELECT * FROM products WHERE id IN (x, y, z)作爲第二個查詢。如果id幾乎但不完全是連續的,那麼你可以調整這個解決方案來生成更多的隨機id,這是爲了解釋並非所有的id都是有效的(在id越多,剩餘數越多你應該生成)。

如果上述不是選項,那麼查詢like this仍然會比純粹的ORDER BY RAND()好。

0

下面是一個PHP的解決方案

$range_res = mysql_query(" SELECT MAX(id) AS max_id , MIN(id) AS min_id FROM products "); 
$range_row = mysql_fetch_object($range_res); 
$random = mt_rand($range_row->min_id , $range_row->max_id); 
$res = mysql_query(" SELECT * FROM products WHERE id >= $random LIMIT 0,1 ");