[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySQL выборка
cyberside
Есть таблица MySQL с данными о баннерах:

CREATE TABLE IF NOT EXISTS `banners` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`image` varchar(64) NOT NULL,
`location` varchar(255) NOT NULL,
`views` int(11) NOT NULL DEFAULT '0',
`priority` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;


Необходимо показывать баннер в зависимости от приоритета и кол-ва просмотров.
Если это приоритетный баннер, необходимо его показывать в (n) раз чаще, чем баннер с более низким приоритетом. Также учитывать кол-во просмотров (у баннеров с более высоким приоритетом, просмотров должно быть на 1 порядок (n) больше, чем у идущего перед ним приоритета (0-9).

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

Благодарю за внимание.
Valick
Цитата
Я не требую готового решения

у вас есть какие-либо свои мысли?
ну тут не особо любят помогать бесплатно на коммерческие темы, я уже не говорю о готовом решении smile.gif
Давайте подумаем что из себя должно представлять поле priority, как формируется зависимость приоритета.
Предлогаю использовать уровни, допустим 0 - это самый низкий, т.е. обычный уровень без каких либо приоритетов, 1,2,3,4,5,6,7,8,9 промежуточные уровни, 10 - VIP статус.
Показ баннеров, особенно коммерческих (статус VIP) подразумевает срок действия этого статуса, в вашей таблице это не отражено.

_____________
Стимулятор ~yoomoney - 41001303250491
Michael
Цитата
должно быть на 1 порядок (n) больше

ты понимаешь что 1 порядок - это в 10 раз? По такой схеме мало приоритетные баннеры никогда не покажутся.

А по сути - тут вообще просто выборка идет из таблицы инфы по всем данным и уже php скрипт определит какому баннеру показаться, в зависимости от алгоритма приоритетов.



_____________
There never was a struggle in the soul of a good man that was not hard
Valick
Цитата
по всем данным и уже php скрипт определит

не согласен, хотя предварительный фильтр на РНР нужно использовать
но основную работу должна выполнять БД, имхо.
cyberside, вообще ротация баннеров вещь очень сложная и достаточно специфическая, да и работает местами не так как хотелось бы, так как "эффект неожиданности" (выбор рандомных значений) присутствует.




_____________
Стимулятор ~yoomoney - 41001303250491
kaww
C приоритетами тут явно напутано. Получается, что пока у баннера c приоритетом 9 не будет показов больше чем 1*10^9 баннер с нулевым приоритетом не будет показан
Michael
Цитата (Valick @ 15.03.2013 - 09:25)
Цитата
по всем данным и уже php скрипт определит

не согласен,


почему то не удивляет

Цитата (Valick)
но основную работу должна выполнять БД, имхо.

пример этой работы БД на данной таблице можешь привести?

_____________
There never was a struggle in the soul of a good man that was not hard
kaww
Цитата (Michael @ 15.03.2013 - 07:36)
пример этой работы БД на данной таблице

думаю нечто подобное
select * from banners
order by views-pow(10,priority)
having priority = max(priority)
order by rand()
Valick
сортировка по приоритету и количеству просмотров, а потом выборка по рандомному значению с применением логарифма, в приоритете будут записи "сверху", а увеличение количества просмотров будет отодвигать их вниз и чем больше тем дальше, соответственно уменьшая шанс на показ. Естественно баннеры без просмотров автоматически будут "лезть" на верх.
Предварительный фильтр о котором я говорил как раз должен определить какой по статусу баннер нужно показать от обычного, до VIP.
Плюс к этому я бы добавил поле время показа, чтобы контролировать время через которое будет показываться баннер (например не чаще чем раз в минуту)
Ну и естественно серьезные алгоритмы ротации ориентированны на конкретного пользователя, а при такой постановке можно на целую книгу материала набрать.

_____________
Стимулятор ~yoomoney - 41001303250491
Michael
Цитата (kaww)
думаю нечто подобное

что то такое топорное если и будет работать, то сильно примитивно. Нужен алгоритм, а не просто выборки.
С порядком наверное он неверно выразился, может в разы имел ввиду.
Я бы, например, на месте ТС подумал о таком варианте: в зависимости от приоритета наполнить массив шансов и из него уже случайно генерировать результат.

_____________
There never was a struggle in the soul of a good man that was not hard
kaww
Michael
, конечно это примитивное решение (даже запрос не оптимален). вариант был предложен исходя из поставленной задачи.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.