当使用ORDER BY RAND()
时,你怎么能对某些记录给予更多“重量”,以便选择它们的机会增加?
答案 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”数量的条目添加到另一个数组,然后从第二个数组中随机选择一个条目。出于某种原因,这对我来说似乎非常草率。