我正在創建一個在線商店網站,需要從數據庫中選擇隨機產品的功能。從數據庫中隨機選擇一行的函數!
這個想法是,每當網頁加載時都會有一個隨機產品的廣告!
使用PHP,我該如何去做這件事?
tbl_products
ID 代碼 標題 股票 成本 RRP
這些都是我需要從數據庫訪問的行。
由於
我正在創建一個在線商店網站,需要從數據庫中選擇隨機產品的功能。從數據庫中隨機選擇一行的函數!
這個想法是,每當網頁加載時都會有一個隨機產品的廣告!
使用PHP,我該如何去做這件事?
tbl_products
ID 代碼 標題 股票 成本 RRP
這些都是我需要從數據庫訪問的行。
由於
一個最簡單的解決方案會是這樣:
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作業中填充而不留空隙。
我會添加一個WHERE股票> 1,並且在任何時候,庫存產品的數量不會超過500.您的解決方案是否可以爲此工作? – sark9012
@Luke他的解決方案應與所有工作WHERE子句 – cwallenpoole
見http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random -row-from-table /想了解爲什麼這可能不是最有效的方法。 – newtron
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()
好。
下面是一個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 ");
有這個尚未已經回答? http:// stackoverflow。com/questions/3624759 /最快的方式獲取隨機記錄從分區 http://stackoverflow.com/questions/211329/quick-selection-of-a-random-row-from-a -large-table-in-mysql –