Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从带有比率的表中选择随机项_Php_Mysql_Sql - Fatal编程技术网

Php 从带有比率的表中选择随机项

Php 从带有比率的表中选择随机项,php,mysql,sql,Php,Mysql,Sql,我试图创建一个mysql表,其中包含一些特殊的数据项。例如,我们有项目1(机会:1)、项目2(机会: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

我试图创建一个mysql表,其中包含一些特殊的数据项。例如,我们有项目1(机会:1)、项目2(机会: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个随机项目。因此,它需要具备以下要求:

  • 总是随机的行
  • 按比例选择行(例如,表中的概率为百分比)
我还发现这个查询几乎符合解决方案,但它不知道我如何处理随机比率(百分比)

如果这可以通过PHP实现,那就太棒了

我愿意接受任何建议。在此期间,我也将尝试自己解决这个问题,但我仍然被卡住了。

让我猜一下,通过“chanse”[sic],你的意思是每一行都有一个权重,你希望这个权重有助于增加一行被选中的机会

一种方法是为每一行生成一个随机数,乘以权重,然后返回生成数最高的5行。不清楚您所说的“偶然”是什么意思,因此这可能会满足您的要求:

select si.*
from (select si.*, rand() * item_ratio as weight
      from special_items si
     ) si
order by weight desc
limit 5;
注意:需要子查询,因此每行只计算一次
权重。我认为这也是同样的道理:

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

但MySQL可能很特别。

向我们展示示例数据和预期输出。请阅读,这里是一个学习如何提高问题质量和获得更好答案的好地方。机会意味着什么?例如,它们加起来不等于1。表中有多少行,选择了多少行?这是一个随机子集还是超集?随机选择5个项目很容易,但比率限制不明确。数据库中将有800个项目,它们都有一个百分比概率比率。选择时,将始终选择5行,并基于以百分比表示的变化。这是什么<代码>机会比率?机会如何影响选择?请给我们一个例子。它需要如何工作的例子:项目1-获得此行的几率1%项目2-获得此行的几率3%项目3-获得此行的几率20%项目4-获得此行的几率25%项目5-获得此行的几率90%项目6-获得此行的几率25%限制条件是,根据随机选择和获得该行的机会,始终获得5行@Gordon LinoffI使用了函数RAND(),因为我不知道函数random会带来什么?你能解释一下吗?解释:一种简单的算法,它允许选择随机行,并考虑所谓的权重值,因此根据此权重值,某些行的选择频率将高于其他行。
select si.*, rand() * item_ratio as weight
from special_items si
order by weight desc
limit 5;