随机挑选一个库存高的产品



我试图选择产品的随机颜色,但我需要对高库存产品的随机性进行加权。因此,如果库存很高,我希望该产品能更频繁地被挑选。这是我正在使用的表格:

CREATE TABLE `cases` (
`id` int(11) NOT NULL,
`status` int(11) NOT NULL,
`color` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
`stock` int(11) NOT NULL,
`date_deleted` datetime DEFAULT NULL,
`deleted_by` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `cases` (`id`, `status`, `color`, `stock`, `date_deleted`, `deleted_by`) VALUES
(2, 2, 'Black', 20, NULL, NULL),
(3, 2, 'Red', 100, NULL, NULL),
(4, 2, 'Blue', 100, NULL, NULL);

我正在使用这个php脚本来测试发行版。您也可以检查我正在使用的查询。我从另一个SO问题中得到了这个,但它不适合我。库存低的黑色案例大部分时间都会被选中,每次都会。

$cases = [];
for ($i=0; $i < 1000; $i++) {
$loadCases = mysqli_query($connect, "SELECT * FROM `cases` WHERE status = 2 AND stock > 0 ORDER BY (RAND()*stock) LIMIT 1");
$case = mysqli_fetch_assoc($loadCases);
if(isset($cases[$case['color']]))
$cases[$case['color']]++;
else
$cases[$case['color']] = 1;
}
var_dump($cases);

典型的结果看起来像这个

Array
(
[Black] => 815
[Red] => 99
[Blue] => 86
)

我需要一个更好的查询。有什么想法吗?

可以注意以下代码:

// for example
$blue_stock = 3;
$black_stock = 2;
$gray_stock = 1;
$green_stock = 1;
// this is your colors
$colors = ['blue','black','gray','green'];
$knuth_colors = [];
foreach($colors as $v) {
switch ($v) {
case blue: 
for ($i = 0; $i < $blue_stock; $i++) {
$knuth_colors[] = 'blue';
} 
break;
......
}
}
$i = mt_rand(0, count($knuth_colors) - 1);
// color use
$knuth_color = $knuth_colors[$i];

查询是正确的,但SQL默认情况下按升序排列结果。因此,更频繁地返回较低的值。此查询解决了问题。

SELECT * FROM `cases` WHERE status = 2 AND stock > 0 ORDER BY (RAND()*stock) DESC LIMIT 1

最新更新