MySQL: случайный выбор, который длится в течение определенного периода времени? - PullRequest
1 голос
/ 04 февраля 2010

Хорошо ... Я потерян (снова). Как я могу создать пользовательское начальное число для rand (), которое будет сохранять выборку из базы данных в течение определенного периода времени: 10 минут, 1 часа, 1 день и т. Д.

Я использую это:

$query = 'SELECT * FROM table order by rand () LIMIT 1';

Чтобы получить случайный выбор каждый раз, когда я обновляю страницу. Я читал в течение нескольких дней, но я просто не могу найти пример, который объясняет, как сделать пользовательское начальное число, которое будет сохранять выбор в течение определенного периода времени. Пожалуйста, помогите мне ... вздохи

Ответы [ 7 ]

1 голос
/ 04 февраля 2010

У меня есть идея для концепции, а не формальное решение:

Используйте md5() на округленной вниз UNIX_TIMESTAMP()/60. У вас есть количество записей в таблице, пусть это будет X. Вычислите число из md5(), пусть это будет Y. Вычислите Y % X, пусть это будет Z. Используйте limit 1 offset Z в конце SQL .

1 голос
/ 04 февраля 2010

Как сказал Доминик Роджер - заказ по ранду ужасен. Но я считаю, что использование cron слишком большое оружие для этой работы. (тем более, что Ты не умеешь)

Вы должны сгенерировать случайное целое число в php, сохранить его и передать его в mysql примерно так:

SELECT * FROM table WHERE id=(MOD('.$php_generated_random.', LAST_INSERT_ID())+1)

он получает большое случайное число и делает это по модулю, чтобы он не превышал длину таблицы.

Это проблема с LAST_INSERT_ID(). Ваш mysql может вернуть 0 во многих случаях.

Так что хороший и безопасный способ сделать это будет:

  1. проверить, пора ли генерировать новое случайное число
  2. если это так, то получить максимальный идентификатор из таблицы (при условии, что длина таблицы иногда изменяется)
  3. генерирует случайное число в качестве идентификатора
  4. сохранить идентификатор и время генерации

и выберите только где id = $ sth

1 голос
/ 04 февраля 2010

Если вы работаете с PHP, вы можете создать алгоритм, который генерирует случайное число (используя rand ()), а затем сохраните это число где-нибудь в базе данных или файле. Затем проверьте текущую дату и дату генерации случайного числа. Рассчитайте разницу и используйте оператор if, чтобы определить, пора ли снова генерировать случайное число. Вот некоторый псевдокод (обратите внимание, что под датой я имею в виду метку времени или время Unix):

$gendate = getGenerationDateFromDB();
$now = getCurrentDate()
if(getDifference($gendate, $now) > [time interval]) then
  $randnum = generateRandNumber();
  saveRandNumberInDB($randnum);
  saveGenDate();
else
  $randnum = getRandNumberFromDB();
1 голос
/ 04 февраля 2010

Вы можете создать временную таблицу:

SELECT * INTO #temp FROM table ORDER BY rand() LIMIT 1

Затем запросите временную таблицу для отображения ваших данных. Удалите / заново создайте таблицу после истечения времени ожидания.

0 голосов
/ 04 февраля 2010

«Создайте пользовательское начальное число»

Я полагаю, что вопрос требует, чтобы вы сделали что-то вроде этого:

$query = 'SELECT * FROM table order by rand (' . get_seed() . ') LIMIT 1';

<?php
// return the current hour.  so the seed is the same each hour
function get_seed() {
  return date('H');
}
?>

Цель «начального числа» - создать такую ​​же случайную последовательностьдля целей тестирования.

RAND(N) Если задан постоянный целочисленный аргумент N, он используется в качестве начального значения, которое создает повторяемую последовательность значений столбца.

0 голосов
/ 04 февраля 2010

ORDER BY RAND() - действительно плохая идея - она ​​убивает производительность базы данных.

Это то, что вы должны запускать в задании cron столько раз, сколько нужно, чтобы «случайный выбор» продолжался, исохраните идентификатор строки, которая является вашим случайным выбором минуты / часа / дня.Вам нужно следить за тем, чтобы строка не удалялась.

0 голосов
/ 04 февраля 2010

После того, как вы выбрали его, вам нужно сохранить эти данные в сеансе, и сеанс может быть установлен в указанное вами время.Нет необходимости каждый раз запрашивать базу данных.А во-вторых, запрос не имеет ничего общего с установкой времени для объявления / чего бы то ни было на указанное время.

...