2011-07-19 26 views
1

私はデータベースからランダムな製品を選択する機能が必要なオンラインストアのWebサイトを作成しています。データベースからランダムに行を選択する関数です。

ウェブページが読み込まれるたびに異なる商品がランダムに表示されるという考えがあります。

PHPを使用して、私はこれをどうやってやりますか?

tbl_products

ID コード タイトル 株式 コスト RRP

これらは、私は、データベースからのアクセスを取得する必要が行です。

おかげ

+0

これは既に回答されていないのか? http:// stackoverflow。com/questions/3624759 /最速ウェイ取得ランダムレコードfrom-db 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が多かれ少なかれ均一に分散している場合は

、これを使用する:

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; 

を使用すると、IDS間のギャップを持っている場合は、大きなギャップ後の製品は、より頻繁に選択される傾向があります。

idの代わりに、この目的のために特別なユニークな列を使用することができます。これは、cronジョブでギャップを埋める必要があります。

+0

WHERE在庫> 1を追加し、いつでも在庫量が500を超えないようにします。 – sark9012

+0

@彼のソリューションはWHERE節すべてで動作するはずです – cwallenpoole

+0

http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-randomなぜこれが最も効率的な方法ではないかもしれないのかについて、いくつか考えてみてください。 – newtron

1

ORDER BY RAND()は、よく知られた問題を有する既知の解決策です。

製品IDが連続した整数の範囲であり、行の数が少ない場合は、SELECT MAX(id) FROM productsよりはるかによくなり、1とPHPの結果の間に多数の乱数が生成されます。SELECT * FROM products WHERE id IN (x, y, z) 2番目のクエリとして使用します。 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 "); 
関連する問題