我正在尝试选择一种随机的产品颜色,但是我需要将随机性加权为高库存产品。因此,如果库存很高,我希望可以经常选择该产品。这是我正在使用的桌子:
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
)
我需要一个更好的查询。有任何想法吗?
该查询是正确的,但默认情况下SQL会将结果按升序排列。因此,较低的值返回的频率更高。该查询解决了该问题。
SELECT * FROM `cases` WHERE status = 2 AND stock > 0 ORDER BY (RAND()*stock) DESC LIMIT 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句