簡體   English   中英

增加在隨機 select 中選擇記錄的機會

[英]Increase the chances of a record being selected in a random select

當使用ORDER BY RAND()時,你怎么能 go 給一些記錄比其他記錄更多的“權重”,這樣它們被選中的機會就會增加?

我發現了一篇關於這個問題的廣泛文章,它提供了一個訂購解決方案。 我離掌握概率、統計學或任何類型的數學非常非常遠,但根據我自己的測試,它似乎相當可靠。 它使用“選擇權重”列的相同想法。只需確保該列的默認值和所有值都非零。

WHERE selection_weight > 0 ... ORDER BY ( -LOG(1.0 - RAND()) / selection_weight )

使用 Mike 發布的更好的隨機選擇查詢,您可以嘗試以下操作:

SELECT users.*
FROM ( SELECT id
       FROM users
       WHERE selection_weight > 0
       ORDER BY ( -LOG(1.0 - RAND()) / selection_weight ) ) AS random_users
JOIN users ON random_users.id = users.id

此查詢在我用於測試的 2,000 條記錄表上運行了 10 到 20 毫秒。 我希望這有幫助!


原始答案

如果表中有對應於選擇權重的 integer 列:

ORDER BY RAND() * selection_weight DESC

但是,這可能會很慢。我會繼續尋找更好的解決方案。

我不知道如何做到這一點,為什么 MySQL,但是如果數據集不是太大,您可以添加一個名為“重量”的列,然后將整個內容返回到一個數組中。 然后使用 php,遍歷數組並將“權重”數量的條目添加到另一個數組,然后隨機 select 來自第二個數組的條目。 出於某種原因,這對我來說似乎真的很草率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM