我试图创建一个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完成,那就太棒了。
我对所有建议持开放态度。在此期间,我也会试图自己解决这个问题,但我仍然陷入困境。
答案 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可能很奇怪。