2016-11-14 13 views
1

増加の発生()

id | entity | value | Frequency 
1 | 2  |abc |5 
2 | 3  |123 |1 
3 | 4  |456 |1 
4 | 5  |789 |1 
5 | 6  |xyz |1 
6 | 7  |lkh |1 
7 | 8  |jpg |1 

SELECT * FROM `table` ORDER BY RAND() LIMIT 1 

を次のように私は、このようなクエリの何かを持っている、これは私のランダムな行を返しますmysqlの行を持っています。そして、周波数列に従って行の発生を増やす方法はありますか?これは、頻度= 5の行がヌル値を持つ人よりも多く発生する必要があることを意味します。

+0

どれくらい出現しますか? –

+0

5回目のような頻度表の値によると、 –

+0

あなたが探しているのは、他の質問で答えられた何らかの重み付けランダムです。 http://stackoverflow.com/questions/1398113/sql-select-one-row-randomly-but-taking-into-account-a-weight –

答えて

1

まず、テーブルにしたがって、最上行の頻度と他の頻度との間には関係がありません行がnull値のためにNullはデータが欠けていることを意味します1行目が選択される確率が5倍、残っていることを示す場合は、ヌルの代わりに数字1を使用します。

選択する一番上の行のチャンスを高めるために、あなたは、単にfrequencyフィールドの値で生成された乱数掛けることができます。これは広告についてであり、あなたがする必要がある場合は、しかし、

SELECT * FROM `table` ORDER BY RAND() * `frequency` LIMIT 1 

は、最初の広告が5回表示されるたびに、アプリケーションで選択されている広告を追跡し、4回選択されなかった場合は上位の広告を選択する必要があります。

+0

独自の列を掛けても、私がやりたかったような出現は得られません10行と10回目の試行で、私は必要な行を見つけることができませんでした –

+0

上記のように、上記の方法は5倍高い**機会**を与えます。それは、5倍多く出現することを保証するものではありません。これについて、次のように考えてみましょう:もしあなたが5枚の宝くじを購入し、他の誰もがただ1枚を買うなら、あなたは5倍の宝くじになる可能性がありますが、勝利するという意味ではありません。答えの最後の段落で説明したように、発生を保証する必要がある場合は、表示されたレコードを追跡する必要があります。 – Shadow

+0

はい現在、私は広告を作っているので、このシナリオでは5倍のチャンスが増えるとは思っていません。テーブル全体を追跡する必要があります –

関連する問題