Система ротационной рекламы MySQL, хранимая процедура или обработка PHP?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Система ротационной рекламы MySQL, хранимая процедура или обработка PHP?

Сообщение Anonymous »

Я пишу рекламную систему mysql/php

У меня есть таблица ads со следующими столбцами

id, место, город, штат, img, URL, просмотры, клики

Каждое рекламное место может иметь до 6 строк для каждой комбинации «город/штат»

Каждый шаблон страницы имеет примерно 15 уникальных рекламных «пятен».

При загрузке страницы мне нужно захватить следующее объявление по очереди для каждого из «мест» в шаблоне и увеличить их «просмотры».

Что я пробовал до сих пор...

Я решил, что для уменьшения количества вызовов базы данных я бы использовал хранимую процедуру, вставленную ниже («состояние» еще не реализовано).

Эта процедура суммирует представления для всех строк, соответствующих заданному «пятну» в заданной комбинации «город/штат», делит сумму на количество совпадающих строк и использует остаток для определения возвращаемой строки.

Мне интересно, правильный ли это подход. Это определенно не самый быстрый способ, и проблемы с «рассинхронизацией команд» возникают с другими функциями базы данных после того, как я вызываю их с помощью mysqli, несмотря на использование метода «query».

Мне интересны альтернативы.

Если я выполняю обработку в PHP и увеличиваю постфактум, я предполагаю, что мне придется отказаться от метода выбора «остатка» и перейти к менее желательному методу «случайного» выбора, чтобы избежать коллизий.

Было бы разумно сделать следующее
  • Добавить столбец «страница»
  • Вернуть все возможные реклама для «страницы» в сочетании «город/штат» на PHP. ** Будет в 6 раз больше, чем будет показано.
  • Случайно выбирать, какие объявления будут отображаться с помощью PHP.
  • Обновить выбранные строки с помощью UPDATE с помощью предложения WHERE id IN ().
Есть еще предложения?

DROP PROCEDURE IF EXISTS get_ads //
CREATE PROCEDURE get_ads(in paramcity VARCHAR(30), IN paramspots VARCHAR(255))
BEGIN

DECLARE s VARCHAR(50);
DECLARE spots VARCHAR(255);
DECLARE p INT(10);
DECLARE l INT(10);

SET s = '';
SET spots = paramspots;
SET p = 0;
SET l = 0;

CREATE TEMPORARY TABLE output (id INT(10) NOT NULL, spot VARCHAR(50) NOT NULL, url VARCHAR(255), image VARCHAR(255));

REPEAT

SET p = LOCATE(',',spots);

IF p > 0 THEN
SET s = SUBSTRING(spots,1,(p - 1));
SET spots = SUBSTRING(spots, (p + 1));
SET l = CHAR_LENGTH(spots);
ELSE
SET s = spots;
SET spots = '';
SET l = 0;
END IF;

INSERT INTO output SELECT (@t2 := dt.id) AS id, spot, url, image FROM (
SELECT @t1 := @t1 + 1 AS num, ads.*
FROM ads, (SELECT @t1 := -1) init
WHERE city = paramcity AND spot = s
ORDER BY id ASC
) dt
WHERE dt.num = (
SELECT SUM(views) % COUNT(id) FROM ads
WHERE city = paramcity AND spot = s);

UPDATE ads SET views = views + 1 WHERE id = @t2;

UNTIL l

Подробнее здесь: https://stackoverflow.com/questions/101 ... processing
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»