Я пытаюсь выбрать случайный цвет продукта, но мне нужно, чтобы случайность была взвешена в сторону продуктов с высоким запасом. Поэтому, если запас высок, я хочу, чтобы этот продукт выбирался чаще. Вот таблица, с которой я работаю:
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
если запас большой, я хочу, чтобы этот товар выбирали чаще. Используйте, например,
ORDER BY RAND() / stock
- меньшеstock
вызовет большую вероятность.