Выберите случайный продукт с большим запасом

Я пытаюсь выбрать случайный цвет продукта, но мне нужно, чтобы случайность была взвешена в сторону продуктов с высоким запасом. Поэтому, если запас высок, я хочу, чтобы этот продукт выбирался чаще. Вот таблица, с которой я работаю:

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
)

Мне нужен лучший запрос. Есть идеи?

если запас большой, я хочу, чтобы этот товар выбирали чаще. Используйте, например, ORDER BY RAND() / stock - меньше stock вызовет большую вероятность.

Akina 12.12.2020 07:55

Самый увлекательный. Почему деление ответа? я не могу понять это

Whip 12.12.2020 08:03

Может не делить, а умножать...

Akina 12.12.2020 08:06

На самом деле деление дает ответы, которые я хотел

Whip 12.12.2020 08:11
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

мог бы возражать против этого кода:

// 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

Другие вопросы по теме