我正在写一个 mysql/php 广告系统
我有一个包含以下列的广告表
id、现场、城市、状态、img、url、视图、点击
每个“城市/州”组合的每个广告“位置”最多可以有 6 行
每个页面模板都有大约 15 个独特的广告“点”
在页面加载时,我需要为模板中的每个“点”轮流抓取下一个广告并增加它们的“浏览量”
到目前为止我尝试过的...
我想减少数据库调用我会使用一个存储过程,插入下面(“状态”尚未实现)。
此过程通过对给定“城市/州”组合中与给定“地点”匹配的所有行的视图进行总计,将总数除以匹配行数,并使用余数确定要返回的行。
我想知道这是否是正确的方法。它绝对不是最快的,并且在我使用 mysqli 调用它之后,其他数据库功能会出现“命令不同步”问题,尽管使用了“查询”方法。
我想知道替代品。
如果我在 PHP 中进行处理并在事后增加,我假设我需要放弃“剩余”选择方法并使用不太理想的“随机”选择方法以避免冲突。
执行以下操作是否明智
- 添加“页面”列
- 将“城市/州”组合中“页面”的所有可能广告返回给 PHP。** 将是显示的 6 倍。
- 通过 PHP 随机选择要显示的广告
- 通过带有 WHERE id IN () 子句的 UPDATE 更新这些选定的行
还有其他建议吗?
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 <= 0 END REPEAT;
SELECT * FROM output;
DROP TEMPORARY TABLE output;
END //