2017-03-15 71 views
0

我正在尝试创建一个mysql表格,其中包含一些特殊项目的数据。例如,我们有条1/1(chanse:1),ITEM2(chanse:1),项目(几率:20%)和 项目3(可能性: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

向我们展示示例数据和预期输出。 \t请阅读[**如何提问**](http://stackoverflow.com/help/how-to-ask) \t \t这里是一个伟大的地方[** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)来了解如何提高您的问题质量并获得更好的答案。 –

+0

机会是什么意思?例如,它们的总和不等于1。你在桌上有多少排,有多少人被选中?这是一个随机的子集或超集? –

+0

随机选择5个项目很容易,但比例限制并不明确。 –

回答

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可能是奇特的。

+0

实施例: 项目1 - 可能有用于获取该行1% 第2项 - 可能有用于获取该行3% 第3项 - 可能有用于获取此列20% 第4项 - 可能有用于得到这一行25% 项目5 - 得到这一行的机会90% 项目6 - 得到这一行的机会25% 限制是你总是得到5行,根据随机选择和获得行的机会。 @Gordon Linoff – Blacky

+0

@Blacky不能解决你的问题吗? –

+0

我使用了函数RAND(),因为我不知道你的函数是随机的吗?你能解释一下吗? – Blacky