Выбор случайных страниц форума

RASAMAHA

Новичок
Добрый день.

Столкнулся с такой проблемой: имеется форум, необходимо в "случайном" порядке на определенною страницу назначать "баннер".
То есть есть список "баннеров" их загружают в систему и им назначаются случайно страницы форума, в последствии при заходе на которые, отображаются эти баннеры.
Дело в том, что сгенерировать случайную страницу оказалось не так просто для меня. С учетом того, что она не должна повторятся при последующей генерации(загрузке баннера).
Еще сложность в том, что страницы форума зависят от нескольких таблиц (topic, user, forum, search).

В общем у меня вопрос, кто как бы решал эту проблему образно говоря? Я придумал решение, но думаю не самое оптимальное. Условия такие, что таблицы форума >100 000 записей в среднем. И баннеров загружается за раз около 1000 штук.

Я пока пришел к такому решению, при загрузке баннеров, прогонять их через цикл, в котором, к каждому баннеру назначается страница форума, по следующему алгоритму, выбирается случайным образом таблица форума (из тех, которые образуют страницы, например topic->id = 123 === /viewtopic.php/123) из нее выбирается случайный id, кроме тех, что уже использованы для других баннеров (NOT IN).
Приблизительно таким запросом:
PHP:
$sql = 'SELECT r1.id FROM topics AS r1
JOIN (
SELECT RAND() * (
SELECT MAX(id)
FROM topics
WHERE (id NOT IN (21,22,2,3,4,5,6,7,8,9,80,23,11,61,64,73,22,12,24,82,18,38,35,78,51,29,13,36,25,31,32,52,53,33,34,40))
) AS id
) AS r2
WHERE (r1.id NOT IN (21,22,2,3,4,5,6,7,8,9,80,23,11,61,64,73,22,12,24,82,18,38,35,78,51,29,13,36,25,31,32,52,53,33,34,40) AND r1.id >= r2.id)
LIMIT 1';
Функции и триггеры использовать нельзя по ТЗ.
Может, что-то где-то коряво объяснил, спрашивайте, просто уже плешь проел этой задачей.
 

С.

Продвинутый новичок
Невозможно дать разумный совет для решения, поскольку ТЗ неадекватное (или неадекватно понято исполнителем).
То есть есть список "баннеров" их загружают в систему и им назначаются случайно страницы форума, в последствии при заходе на которые, отображаются эти баннеры.
У форумов есть такая отличительная особенность -- страницы у форума множатся по мере добавления топиков. Какие банеры будут отражены на новых траницах форума, появившихся после процедуры распределения банеров по страницам?
 

RASAMAHA

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

У форумов есть такая отличительная особенность -- страницы у форума множатся по мере добавления топиков. Какие баннеры будут отражены на новых страницах форума, появившихся после процедуры распределения банеров по страницам?
Никакие. Так как никакой баннер им еще не назначен. Баннер показывается только на той странице, к которой он привязан.

Мне интересно, как выйти из положения?

Я остановился на таком варианте:
Создать таблицу ad с столбцами id, banner, forum_page, это образно, можно время и прочее добавить, это основные.
Все страницы форума имеют свой шаблон: (/viewtopic/id, /viewforum/id, /user/id), где для каждого своя таблица в базе. Есть и одиночные страницы, вроде /search, /rule/ и др. но это можно учесть.
Поле forum_page будет иметь следующий шаблон: /viewtopic/34, /viewforum/45, /user/567 и др.

При загрузке баннера (возьмем для примера один, для нескольких просто то же самое в цикле :) ), случайным способом выбираем один из шаблонов страницы форума, например /user/id.
Ищем в таблице ad в столбце forum_page все ссылки, которые имеют шаблон /user/id и берем из этих шаблонов id.
Выполняем запрос из первого поста с NOT IN из этих id и из таблицы, которая соответствует этому шаблону. То есть user.
Если записи не существует, выбираем новый шаблон исключая этот.

Что касается существующих и несуществующих страниц форума после добавления баннера, можно будет сделать какую-нибудь проверку в панели. Которая выявит несуществующие страницы.


Также думал создать отдельную таблицу со списком страниц форума, но отказался, так как она будет быстро устаревать. А генерация и модификация такой таблицы непростая задача.
Но было бы проще вытащить случайную страницу (строку), отсортировав по какому-нибудь хешу и вытаскивая по очереди.
 

С.

Продвинутый новичок
Я остановился на таком варианте:
Создать таблицу ad с столбцами id, banner, forum_page
Это единственный вариант "в лоб" для описанного ТЗ. Ничего другого тут и не придумаешь.
 
  • Like
Реакции: SiZE

iceman

говнокодер
RASAMAHA
привяжись на ключевые слова, ч т о л и. Тогда баннер вероятней найдет своего клиента.

Ощущение, как-будто наши технологи писали для вас ПЗ :)
 

С.

Продвинутый новичок
iceman, окстись! Там тупое ТЗ реализуется аккуратным исполнителем. Чего ты тут креатив растопыриваешь?
 
Сверху