MySQL:选择随机条目,但对某些条目进行权重

2022-08-30 12:14:24

我有一个MySQL表,里面有一堆条目,还有一个名为“乘数”的列。此列的默认(也是最常见的)值为 0,但可以是任何数字。

我需要做的是从该表中随机选择单个条目。但是,行将根据“乘数”列中的数字进行加权。值为 0 表示它根本没有加权。值为 1 表示其权重是其两倍,就好像该条目在表中出现两次一样。值为 2 表示其权重是表的三倍,就好像该条目在表中的权重是三倍。

我正在尝试修改我的开发人员已经给我的东西,所以很抱歉,如果设置没有多大意义。我可能会更改它,但希望尽可能多地保留现有的表设置。

我一直在试图弄清楚如何使用SELECT和RAND()来做到这一点,但不知道如何进行加权。可能吗?


答案 1

这个家伙问同样的问题。他说的和弗兰克一样,但是权重并不正确,在评论中有人建议使用,在我的测试中给出了非常完美的结果。ORDER BY -LOG(1.0 - RAND()) / Multiplier

(如果有任何数学家想解释为什么这是正确的,请启发我!但它有效。

缺点是您无法将权重设置为 0 以暂时禁用某个选项,因为您最终会被零除以。但是您始终可以使用.WHERE Multiplier > 0


答案 2

为了获得更好的性能(特别是在大表上),请首先为权重列编制索引,然后使用此查询:

SELECT * FROM tbl AS t1 JOIN (SELECT id FROM tbl ORDER BY -LOG(1-RAND())/weight LIMIT 10) AS t2 ON t1.id = t2.id

在40MB的表上,通常的查询在我的i7机器上需要1秒而这个需要0.04秒

有关为什么这更快的解释,请参阅MySQL从600K行中快速选择10个随机行


推荐