У меня есть таблица 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
Мобильная версия