私はただのMySQLでこれを行う方法があるかどうかわからないんだけど、この質問をする前に上げ、PHPで対処されています。基本的にGenerating random results by weight in PHP?
、あなたは(引用IDとウェイトを引くしたい[ id => 1, weight => 0.5]
)とすべての重みの合計(あなたの例では0.90
)。次に、特定の順番で配列をループし、各重みを減算します。
私は、これらの値を
[
[ 'id' => 1, weight => 1 ],
[ 'id' => 2, weight => 2 ],
[ 'id' => 3, weight => 4 ],
]
をMySQLのテーブルを持っている場合には、すべての重みの合計であるため、だから、あなたは、その後、0
と7
間の数を生成します。この時点で、各項目を取り、乱数から引きます。例は次のようになります。
$quoteWeights = Quote::select('id', 'weight')->get();
$weightSum = $quoteWeights->sum('weight');
$weightRand = mt_rand(0, $weightSum);
foreach ($quoteWeights as $quoteWeight)
{
// Subtract our weight from the rand.
$weightRand -= $quoteWeight->weight;
// If it's bust, we want to return the winning model.
if ($weightRand <= 0)
{
// Refresh the model so we get all attributes.
return $quoteWeight->fresh();
}
}
これはテストされていないコードですが、正しく実行されています。
高負荷のサーバーまたは巨大な見積もりデータベースを使用している場合は、最初の部分でキャッシュを呼び出すことができます。
回答ありがとうございます。ニースのテクニック –