增加在随机选择中选择记录的机会

时间:2011-07-09 23:07:40

标签: php mysql random

当使用ORDER BY RAND()时,你怎么能对某些记录给予更多“重量”,以便选择它们的机会增加?

2 个答案:

答案 0 :(得分:3)

我发现an extensive article on the problem提供了一个排序解决方案。我非常,非常,远非掌握概率,统计数据或任何类型的数学,但基于我自己的测试,它似乎非常可靠。它使用“选择权重”列的相同概念。只需确保此列的默认值和所有值都为非零值。

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

使用Mike发布的better random-selection query,您可以尝试以下内容:

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毫秒运行。我希望这有帮助!


原始答案

如果表中的整数列对应于选择权重:

ORDER BY RAND() * selection_weight DESC

然而,这可能会非常缓慢。我会继续寻找更好的解决方案。

答案 1 :(得分:1)

我不确定如何为MySQL做这个,但是如果数据集不是太大,你可以添加一个名为“weight”的列,然后将整个事物返回到一个数组中。然后使用php,遍历数组并将“weight”数量的条目添加到另一个数组,然后从第二个数组中随机选择一个条目。出于某种原因,这对我来说似乎非常草率。