Здравствуйте. В базе есть 5000 баннеров.
При заходе на страницу показывается 1 из них и записывается в бд, username, banner_id, date. Дальше нужно показать 2-ой баннер, а уже просмотренные не показывать (через 24 часа таблица чистится кроном)
Как можно реализовать выборку не просмотреного баннера?
Думаю делать так, но не очень уверен в верности решения
1) Получаю массив ids всех просмотренных баннеров
2) В таблицу с баннерами sql where not in
Почему не добавить поле N типа int с количеством просмотренных баннеров?
При переходе на страницу отдавать N-ый баннер, записывать N+1 в поле. Кроном обнулять счетчик
gaga31, если я правильно понял Вашу задачу, то надо показывать баннеры по порядку от 1 до 5 000. То бишь порядок нам важен. Следовательно, если мы добавляем новый баннер, от обнуляем счетчик, чтобы пользователь сразу увидел новый баннер. Или добавляем +1 к счетчику. Тогда пользователь будет показан след. баннер, а новые увидит только когда cron обнулит счетчик(через 24 часа как в задаче).
Поправьте, если я неправильно понял задачу.
ps если у Вас идет какая-то сортировка(по названию, категории и тд), то лучше добавить поле, которое отвечает за состояние(был показан баннер или нет). При запросе фильтруйте по состоянию и отдавайте первый(ну а состояние меняете есесно). Тип такого что-то на примере JSON:
Баннеры не одни для всех, а эти 5000 идут для каждого пользователя т.е
1-ый юзер посмотрел 5, а второй 0. Значит первому показываем 6-ый баннер,а 2-ому юзеру 1-ый баннер.
И если допустим появится новый баннер с id 5001 и ему изменил sort_id на 3 , то его нужно добавить в очередь и первому юзеру показать следующим. А потом показывает sort_id 7 т.е продолжается дальше порядок
gaga31, sort_id это порядок показа? Тогда назовите лучше order. Вы можете хранить в куках пользователя номер баннера, который нужно показать. При запросе передавать его(сохранять новый в куках) и уже по нему определять какой баннер нужно отдавать. Нет необходимости засорять базу данных ненужной информацией.
Aleksey Solovyev, Куки могут подчистить и все собьется, а этого нельзя допускать.
Допустим если щас номер 7 показывает , а через админку поместил sort_id 3, то этот баннер пропустил.
Как сделать что бы не пропустило. И sort_id это порядок показа
gaga31, хм... остается только создать список показанных баннеров для каждого пользователя. При запросе исключать все из списка и по sort_id(order) первый отдавать(Вы что-то такое и имели ввиду в своем вопросе).
ps по крону обнулять список
Добавьте в таблицу баннеров пользователям поле - время показа, при показе обновлять это поле на текущее время.
Запрос на случайный баннер - условие фильтрации дата показа меньше начала сегодняшнего дня.
В итоге, не придется ежедневно обновлять всю баузу, сбрасывая показы. Так же бонусом можете менять интервал сброса (например каждую неделю или каждый час, не важно, это просто меняется дата в условии фильтрации)