我有一个带有大量条目的MySQL表,以及一个名为“ Multiplier”的列。此列的默认值(也是最常见的)是0,但可以是任何数字。我需要做的是从该表中随机选择一个条目。但是,将根据“乘数”列中的数字对行进行加权。值为0表示完全不加权。值1意味着它的权重是表中条目的两倍,是它的两倍。值2表示它的权重是表中该条目的三倍,是它的三倍。我正在尝试修改开发人员已经给我的内容,所以如果设置没有任何意义,请您抱歉。我可能可以更改它,但要保留尽可能多的现有表设置。我一直在尝试找出如何使用SELECT和RAND()进行此操作,但不知道如何进行加权。可能吗?
3 回答
红糖糍粑
TA贡献1815条经验 获得超6个赞
为了获得更好的性能(特别是在大表上),请首先为weight列建立索引并使用以下查询:
SELECT * FROM tbl WHERE id IN
(SELECT id FROM (SELECT id FROM tbl ORDER BY -LOG(1-RAND())/weight LIMIT x) t)
使用两个子查询,因为MySQL在第一个子查询中尚不支持LIMIT。
在40MB的表上,通常的查询在我的i7机器上花费1s,而这个查询花费0.04s。
添加回答
举报
0/150
提交
取消