【发布时间】:2016-11-08 00:53:00
【问题描述】:
我正在尝试编写一个查询,该查询将从表中随机选择一些文章,但这些文章具有被选择的加权机会。我想出了一个解决方案,但对我来说似乎很笨拙,我想知道是否有人对如何做得更好有任何想法。我需要至少 1 篇文章,但如果查询一次返回多篇文章会很有帮助。
这是我的方法:
桌子 --
mysql> describe randomiser;
+---------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+----------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| article | varchar(30) | YES | | NULL | |
| chance | smallint(5) unsigned | NO | MUL | 1 | |
| low | int(10) unsigned | NO | MUL | 0 | |
| high | int(10) unsigned | NO | | 0 | |
+---------+----------------------+------+-----+---------+----------------+
我的测试人群--
mysql> select * from randomiser;
+----+-------------+--------+-----+------+
| id | article | chance | low | high |
+----+-------------+--------+-----+------+
| 1 | common | 128 | 1 | 128 |
| 2 | uncommon | 64 | 129 | 192 |
| 3 | infrequent1 | 32 | 193 | 224 |
| 4 | infrequent2 | 32 | 225 | 256 |
| 5 | infrequent3 | 32 | 257 | 288 |
+----+-------------+--------+-----+------+
每当有人向表中添加新文章时,都会在插入时更新低值和高值。
我的选择方法--
SET @t:=(SELECT FLOOR( SUM(chance) * RAND() + 1) FROM randomiser);
SELECT article FROM randomiser WHERE @t >= low AND @t <= high;
- 是否可以将选择组合成一个有效的语句?
- 是否可以编写一个选择来提取多个随机值而不是一个?
注意 - 我根本没有像我定义的那样依附于表格;如果有不同类型的布局,那么它会更有效,我想知道!
【问题讨论】:
标签: mysql random selection weighted