2010-02-04 3 views
1

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

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

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

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

+0

Тот факт, что вы не выбрали ответ из множества предложений, предполагает, что никто не понимает, что вы хотите. Я вижу конфликт между «конкретным периодом времени» и «каждый раз, когда я обновляюсь». Вы должны лучше описать проблему. Не упоминайте свое собственное «решение» - я думаю, что упоминание о «обычном семени» просто сбило с толку. Пожалуйста, объясните характер вашей базы данных (реальное приложение или домашнее задание), использование случайного выбора (только ваша веб-страница или другие пользователи базы данных) и какие условия вызывают необходимость в другом случайном выборе. – gary

ответ

1

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

Вы должны достаточно сгенерировать случайное целое число в PHP и сохранить его и передать его в MySQL на что-то вроде этого:

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

он получает большое случайное число и делает modulo, так что он не проходит над длиной таблицы.

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

Так good'n'safe путь, чтобы сделать это было бы:

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

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

0

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

+0

Еще раз - не знаю, как это сделать ... -newbie- – Izumi

0

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

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

+0

Никогда не работал с заданиями cron, поэтому я понятия не имею, как это сделать. – Izumi

+0

@lzumi - go посмотреть http://www.howtoforge.com/a-short-introduction-to-cron-jobs. –

0

«Создание пользовательских семян»

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

$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

Но это будет только случайным образом N-раз, правильно? Это не будет длиться в течение N ... или? .. – Izumi

+0

В моем случае N - текущий час. – Yada

+0

Это не вопрос (создайте семя) ... это я пытаюсь объяснить, что мне кажется нужным ... Как вы его разместили, сохранит ли он выбор в течение часа, а затем перейдет на новый? – Izumi

1

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

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

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

1

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

$gendate = getGenerationDateFromDB(); 
$now = getCurrentDate() 
if(getDifference($gendate, $now) > [time interval]) then 
    $randnum = generateRandNumber(); 
    saveRandNumberInDB($randnum); 
    saveGenDate(); 
else 
    $randnum = getRandNumberFromDB(); 
1

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

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

+0

Вы можете использовать последние шестнадцатеричные цифры всей суммы md5. – Notinlist

+0

Я действительно не понимаю ... никогда не слышал о md5 ... – Izumi

+0

md5 - это полусинтетическая функция контрольной суммы. Как CRC. Он используется для маркировки/проверки образов ISO. http://en.wikipedia.org/wiki/MD5 Производит такие вещи, как 'd41d8cd98f00b204e9800998ecf8427e' из любой строки. Очень хаотично. – Notinlist

Смежные вопросы