1

我正在写一个 mysql/php 广告系统

我有一个包含以下列的广告表

id、现场、城市、状态、img、url、视图、点击

每个“城市/州”组合的每个广告“位置”最多可以有 6 行

每个页面模板都有大约 15 个独特的广告“点”

在页面加载时,我需要为模板中的每个“点”轮流抓取下一个广告并增加它们的“浏览量”

到目前为止我尝试过的...

我想减少数据库调用我会使用一个存储过程,插入下面(“状态”尚未实现)。

此过程通过对给定“城市/州”组合中与给定“地点”匹配的所有行的视图进行总计,将总数除以匹配行数,并使用余数确定要返回的行。

我想知道这是否是正确的方法。它绝对不是最快的,并且在我使用 mysqli 调用它之后,其他数据库功能会出现“命令不同步”问题,尽管使用了“查询”方法。

我想知道替代品。

如果我在 PHP 中进行处理并在事后增加,我假设我需要放弃“剩余”选择方法并使用不太理想的“随机”选择方法以避免冲突。

执行以下操作是否明智

  1. 添加“页面”列
  2. 将“城市/州”组合中“页面”的所有可能广告返回给 PHP。** 将是显示的 6 倍。
  3. 通过 PHP 随机选择要显示的广告
  4. 通过带有 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 //
4

0 回答 0