Как получить случайное (но уникальное для даты) значение первичного ключа? - PullRequest
1 голос
/ 23 октября 2009

У меня есть около 10000 продуктов в таблице продуктов. Я хочу получить один из этих элементов и отобразить его в разделе веб-страницы, который остается неизменным для этого конкретного дня. Что-то вроде «Продукта дня».

Например, если сегодня я получу product_id 100, то все посетители должны просматривать этот товар сегодня. Завтра он может получить любой случайный действительный первичный ключ, скажем, 1289, и посетители завтра получат продукт 1289 в течение дня.

Есть идеи / предложения?

Спасибо за вашу помощь.

Ответы [ 7 ]

3 голосов
/ 23 октября 2009
SELECT  id
FROM    products
ORDER BY
        RAND(UNIX_TIMESTAMP(CURRENT_DATE()))
LIMIT 1
2 голосов
/ 23 октября 2009

Идея довольно проста,

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

Это не тот комплекс операций.

2 голосов
/ 23 октября 2009

Может быть, вы можете хранить идентификатор элемента дня в таблице в базе данных?

2 голосов
/ 23 октября 2009

Как насчет создания файла кэша и аннулирования его в полночь?

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

Для этого вам не нужна работа CRON:

if(date_of_file(potd_cache_file) != today){
  potd_cache_file = generate_from_db();
}
load_file(potd_cache_file);

Это будет означать, что только первый посетитель дня на ваш сайт будет запускать регенерацию, и каждому последующему посетителю будет предоставлен файл кеша быстрой загрузки.

1 голос
/ 23 октября 2009
SELECT  id
FROM    products
ORDER BY (id + RAND(UNIX_TIMESTAMP(CURRENT_DATE()))) MOD some_reasonable_value
LIMIT 1
0 голосов
/ 23 октября 2009
total = SELECT COUNT(id) FROM products;
day_product = SELECT id FROM products WHERE id = (UNIX_TIMESTAMP(CURRENT_DATE()) MOD total) LIMIT 1;

См. Также этот вопрос .

0 голосов
/ 23 октября 2009

Вы можете запустить генераторы случайных чисел с начальным значением.

Сделайте так, чтобы начальное значение было днем ​​(21-е) + месяц (10) + год (2009), чтобы сегодняшнее семя было 2041.

Вы получите одно и то же случайное число весь день, а завтра другое. Это больше, как это работает в .net. Функция random принимает значения max и min (это ваши значения min и max ID), а затем необязательное начальное значение и возвращает число. Для одного и того же начального номера вы получаете одно и то же случайное число. Это возможно, если вы измените max и min, это может повлиять на генерируемое число. Вам нужно посмотреть, как работает php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...