假设我有一个充满记录的表,我想从中提取随机记录。但是,我希望该表中的某些行比其他行更频繁地出现(并且哪些行因用户而异)。使用 SQL 解决此问题的最佳方法是什么?
我能想到的唯一方法是创建一个临时表,用我想要更常见的行填充它,然后用从表中随机选择的其他行填充它。有没有更好的办法?
最佳答案
我能想到的一种方法是在表中创建另一列,它是你的权重的滚动总和,然后通过生成一个介于 0 和所有权重总和之间的随机数来提取你的记录,并使用小于随机数的最高滚动总和值。
例如,如果您有四个具有以下权重的行:
+---+--------+------------+
|row| weight | rollingsum |
+---+--------+------------+
| a | 3 | 3 |
| b | 3 | 6 |
| c | 4 | 10 |
| d | 1 | 11 |
+---+--------+------------+
然后,选择一个随机数n
介于 0 和 11 之间(含),并返回行 a
如果0<=n<3
, b
如果3<=n<6
, 等等。
这里有一些关于生成滚动总和的链接:
http://dev.mysql.com/tech-resources/articles/rolling_sums_in_mysql.html
http://dev.mysql.com/tech-resources/articles/rolling_sums_in_mysql_followup.html
关于sql - 以加权机会从数据库中提取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150652/