Joh*_*ohn 36 php mysql random select database-table
我有一个MySQL表,里面有一堆条目,还有一个名为"Multiplier"的列.此列的默认(和最常见)值为0,但可以是任何数字.
我需要做的是随机从该表中选择一个条目.但是,行根据"乘数"列中的数字进行加权.值为0意味着它根本没有加权.值为1意味着它的加权值是两倍,就像条目在表中两次一样.值为2意味着它的加权值是其三倍,就像条目在表中三次一样.
我正在尝试修改我的开发人员已经给我的内容,很抱歉,如果设置没有多大意义.我可能会改变它,但希望保留尽可能多的现有表格设置.
我一直试图弄清楚如何使用SELECT和RAND(),但不知道如何进行加权.可能吗?
lim*_*mos 41
这家伙问同样的问题.他说和弗兰克一样,但是权重并没有出现在有人建议使用的评论中ORDER BY -LOG(1.0 - RAND()) / Multiplier,这在我的测试中给出了非常完美的结果.
(如果有任何数学家想解释为什么这是正确的,请赐教我!但它有效.)
缺点是您无法将权重设置为0以暂时禁用选项,因为您最终将除以零.但你总是可以用一个过滤掉它WHERE Multiplier > 0.
为了获得更好的性能(特别是在大表上),首先索引权重列并使用此查询:
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机器上需要1 秒,而这个需要0.04秒.
不要使用0,1和2,而是使用1,2和3.然后您可以将此值用作乘数:
SELECT * FROM tablename ORDER BY (RAND() * Multiplier);
小智 0
无论你做什么,都是很糟糕的,因为它将涉及: * 将所有列的总“权重”作为一个数字(包括应用乘数)。* 获取 0 和总数之间的随机数。* 获取所有条目并运行它们,从随机数中扣除重量,并在用完条目时选择一个条目。
平均来说,你会沿着桌子的一半跑。性能 - 除非表很小,否则在内存中的 mySQL 之外执行 - 将会很慢。