我正在尝试创建一个mysql表,其中包含一些数据,这些数据是特殊项。例如,我们有item1(chanse: 1)、item2(chanse: 1)、item(机会: 20%)和item3 (chance: 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完成,那就太棒了。
我愿意听取任何建议。在此期间,我也会自己想办法解决这个问题,但我还是被困住了。
发布于 2017-03-15 18:28:22
让我猜猜"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可能很奇特。
https://stackoverflow.com/questions/42817611
复制相似问题