2009-10-23 3 views
1

У меня около 10 000 продуктов в таблице продуктов. Я хочу получить один из этих элементов и отобразить его в разделе веб-страницы, который остается таким же для этого конкретного дня. Что-то вроде «Продукт дня».Как получить случайное (но уникальное для даты) значение первичного ключа?

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

Любые идеи/предложения?

Благодарим за помощь.

+0

Что именно вы спрашиваете? Как выбрать случайный 'product_id'? Как помнить, какой из них вы выбрали? – SLaks

+0

Выбор случайного product_id, который мой сайт «имеет в виду» в этот конкретный день.что-то вроде продукта дня. – TigerTiger

+0

Это вопрос SQL или вопрос PHP? –

ответ

3
SELECT id 
FROM products 
ORDER BY 
     RAND(UNIX_TIMESTAMP(CURRENT_DATE())) 
LIMIT 1 
+0

Похоже на меня. Позвольте мне проверить это. Благодарю. – TigerTiger

2

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

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

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

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

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

+0

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

+0

, поэтому другие предметы могут меняться, но в тот же день они остаются одинаковыми. – TigerTiger

+0

Если он не может быть сохранен в базе данных, я бы сделал это тоже, я думаю. У вас есть один записываемый файл с идентификатором. Затем, когда просматривается страница, проверьте дату изменения и, если она была вчера, получите новый идентификатор и сохраните его в файле, иначе используйте идентификатор в файле. Дата также может быть сохранена в файле, конечно, вместо проверки даты изменения. – Svish

2

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

+0

Да, могу. Но мне нужно, чтобы кто-то (администратор) делал это и менял его каждый день. – TigerTiger

+4

Не совсем. Вы просто делаете код «Если существует случайный случай, используйте его, иначе выберите» –

+0

В качестве альтернативы, установите задание cron, чтобы каждый день выбирать один случайный элемент и хранить его в таблице. –

1
SELECT id 
FROM products 
ORDER BY (id + RAND(UNIX_TIMESTAMP(CURRENT_DATE()))) MOD some_reasonable_value 
LIMIT 1 
2

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

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

Не тот комплекс операции.

+1

+1, мне это нравится, это дает вам возможность иметь историю «продукта дня». – Vamos

0

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

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

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

0
total = SELECT COUNT(id) FROM products; 
day_product = SELECT id FROM products WHERE id = (UNIX_TIMESTAMP(CURRENT_DATE()) MOD total) LIMIT 1; 

См. Также this question.

+0

Что делать, если 'id' являются разреженными? – Quassnoi

+0

Они никогда не должны быть в приложении для электронной торговли, они должны иметь удаленный флаг вместо фактического удаления. –

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