RASAMAHA
Новичок
Добрый день.
Столкнулся с такой проблемой: имеется форум, необходимо в "случайном" порядке на определенною страницу назначать "баннер".
То есть есть список "баннеров" их загружают в систему и им назначаются случайно страницы форума, в последствии при заходе на которые, отображаются эти баннеры.
Дело в том, что сгенерировать случайную страницу оказалось не так просто для меня. С учетом того, что она не должна повторятся при последующей генерации(загрузке баннера).
Еще сложность в том, что страницы форума зависят от нескольких таблиц (topic, user, forum, search).
В общем у меня вопрос, кто как бы решал эту проблему образно говоря? Я придумал решение, но думаю не самое оптимальное. Условия такие, что таблицы форума >100 000 записей в среднем. И баннеров загружается за раз около 1000 штук.
Я пока пришел к такому решению, при загрузке баннеров, прогонять их через цикл, в котором, к каждому баннеру назначается страница форума, по следующему алгоритму, выбирается случайным образом таблица форума (из тех, которые образуют страницы, например topic->id = 123 === /viewtopic.php/123) из нее выбирается случайный id, кроме тех, что уже использованы для других баннеров (NOT IN).
Приблизительно таким запросом:
Функции и триггеры использовать нельзя по ТЗ.
Может, что-то где-то коряво объяснил, спрашивайте, просто уже плешь проел этой задачей.
Столкнулся с такой проблемой: имеется форум, необходимо в "случайном" порядке на определенною страницу назначать "баннер".
То есть есть список "баннеров" их загружают в систему и им назначаются случайно страницы форума, в последствии при заходе на которые, отображаются эти баннеры.
Дело в том, что сгенерировать случайную страницу оказалось не так просто для меня. С учетом того, что она не должна повторятся при последующей генерации(загрузке баннера).
Еще сложность в том, что страницы форума зависят от нескольких таблиц (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';
Может, что-то где-то коряво объяснил, спрашивайте, просто уже плешь проел этой задачей.