Таблица: Фамилия____Вероятность Петров__________20 Сидоров_________30 Иванов__________80 Петушков________70 Кукушкин________50 Необходимо выбрать две фамилии с учетом вероятности. Т.е. скорее всего в выборке будет Иванов с Петушковым и наименее всего Петров. Как это реализовать? Важно, чтобы при обновлении страницы результат менялся и редко, но Петров с Сидоровым тоже попадались.
Re: Интересная задачка: Выборка из MySql с учетом вероятност Пусть табличка будет такая: Код (Text): CREATE TABLE IF NOT EXISTS `test` ( `name` varchar(255) NOT NULL, `chance` smallint(5) unsigned NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `test` (`name`, `chance`) VALUES ('Петров', 20), ('Сидоров', 30), ('Иванов', 80), ('Петушков', 70), ('Кукушкин', 50); Тогда Ваш запрос к ней будет такой: Код (Text): SELECT `name`, `chance`, RAND() * 100 <= `chance` as `probability` FROM `test` ORDER BY `probability` DESC, `chance` DESC LIMIT 2 Получается что RAND() * 100 <= `chance` это вероятность попадания в выборку.
Re: Интересная задачка: Выборка из MySql с учетом вероятност Это скорее всего будет фулскан, не смотря на лимит. При таком раскладе проще выбрать всю таблицу и в пхп сделать реальный рассчет Я не понимаю, что за выборка будет в данном случае.
Re: Интересная задачка: Выборка из MySql с учетом вероятност Пока для себя нашел следующее решение задачи. Но оно громоздкое и что-то мне подсказывает, что есть более элегантное решение. Но все же: 1. Поочередно через цикл обрабатываем каждую строчку массива. 2. Определяем будет ли показываться строка. Формула: ЕСЛИ [ОКРУГЛЕНИЕ_ВВЕРХ(РНД;(ВЕР/100))=ВЕР/100], то ДА, иначе НЕТ, где: РНД - случайное число от 0 до 1, ВЕР - вероятность из таблицы ДА - показываем НЕТ - не показываем 3. Каждую обработанную строчку со значением "ДА" записать в новый массив. 4. Новый массив отсортировать по весу и показать первые два значения. Этот алгоритм подходит, при условии, что массив не содержит большое количество строчек, иначе, при условии вывода малого количества строчек (в моем случае две), вероятность выпадения хоть какого-либо элемента пропорциональна размеру массива.
Re: Интересная задачка: Выборка из MySql с учетом вероятност semnt, не годится для случая когда chance одинаковый у 2+ строчек. те, что за первыми двумя, никогда не попадут в выборку. Добавлено спустя 10 минут 50 секунд: Re: Интересная задачка: Выборка из MySql с учетом вероятности мне кажется если записей будет гарантированно мало, то сгодится перемешивание кеша либо магия с ORDER BY RAND() если записей много, то надо по критерию chance выбрать десяток и уже его перемешивать и брать два первых короче оптимизация состоит в сокращении рабочего подмножества, а каким образом — зависит от контекста