首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从具有比率的表中选择随机项

从具有比率的表中选择随机项
EN

Stack Overflow用户
提问于 2017-03-15 18:14:24
回答 1查看 447关注 0票数 0

我正在尝试创建一个mysql表,其中包含一些数据,这些数据是特殊项。例如,我们有item1(chanse: 1)、item2(chanse: 1)、item(机会: 20%)和item3 (chance: 20)等。等等。-机会在%

因此,我创建了一个包含以下信息的表:

代码语言:javascript
复制
CREATE TABLE `special_items` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `item_id` int(11) NOT NULL,
  `item_name` varchar(255) DEFAULT NULL,
  `item_type` enum('SPECIAL','SILVER','BRONZE','GOLD') NOT NULL DEFAULT 'BRONZE',
  `item_ratio` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`) USING BTREE,
  UNIQUE KEY `item` (`item_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of special_items
-- ----------------------------
INSERT INTO `special_items` VALUES ('1', '200', 'special_name1', 'BRONZE', '80');
INSERT INTO `special_items` VALUES ('2', '204', 'special_name2', 'BRONZE', '4');
INSERT INTO `special_items` VALUES ('3', '875', 'special_name3', 'BRONZE', '80');
INSERT INTO `special_items` VALUES ('4', '900', 'special_name4', 'BRONZE', '60');
INSERT INTO `special_items` VALUES ('5', '901', 'special_name5', 'SILVER', '90');
INSERT INTO `special_items` VALUES ('6', '968', 'special_name6', 'BRONZE', '65');
INSERT INTO `special_items` VALUES ('7', '777', 'special_name7', 'BRONZE', '30');

我们现在要做的是从800行中选择5个随机项目。因此,它需要有以下要求:

  • 总是随机行。
  • 按比率选择行(例如,表中的机会是百分比)

我还找到了这个几乎符合解决方案的查询,但它不知道如何处理随机比率(百分比)。

代码语言:javascript
复制
SELECT item_name
  FROM special_items AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM special_items)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 5

如果这可以通过PHP完成,那就太棒了。

我愿意听取任何建议。在此期间,我也会自己想办法解决这个问题,但我还是被困住了。

EN

回答 1

Stack Overflow用户

发布于 2017-03-15 18:28:22

让我猜猜"chanse“原文,你的意思是每一行都有一个权重,而你希望这个权重对选择一行的机会有所贡献。

一种方法是为每一行生成一个随机数,乘以权重,然后返回5行,其中生成的数最多。现在还不清楚你所说的机会意味着什么,所以这可能会做你想做的事情:

代码语言:javascript
复制
select si.*
from (select si.*, rand() * item_ratio as weight
      from special_items si
     ) si
order by weight desc
limit 5;

注意:需要子查询,因此每一行只计算一次weight。我想这也是一样的:

代码语言:javascript
复制
select si.*, rand() * item_ratio as weight
from special_items si
order by weight desc
limit 5;

但MySQL可能很奇特。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42817611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档