从比率表中选择随机项

时间:2017-03-15 18:14:25

标签: php mysql sql

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

所以我创建了一个包含以下信息的表:

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个随机项目。所以它需要有以下要求:

  • 始终是随机行。
  • 按比例选择行数(例如,表中的几率为百分比)

我也发现这个查询几乎适合解决方案,但它不知道如何以随机比率(百分比)来做这个

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完成,那就太棒了。

我对所有建议持开放态度。在此期间,我也会试图自己解决这个问题,但我仍然陷入困境。

1 个答案:

答案 0 :(得分:0)

让我猜一下" chanse" [原文],你的意思是每一行都有一个权重,你希望这个权重有助于选择一行。

一种方法是为每一行生成一个随机数,乘以权重,然后返回生成数最多的5行。目前还不清楚你的意思是什么,所以这可能会做你想要的:

select si.*
from (select si.*, rand() * item_ratio as weight
      from special_items si
     ) si
order by weight desc
limit 5;

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

select si.*, rand() * item_ratio as weight
from special_items si
order by weight desc
limit 5;

但MySQL可能很奇怪。