MySQL旋转广告系统、存储过程还是php处理?

MySQL旋转广告系统、存储过程还是php处理?,php,stored-procedures,mysqli,Php,Stored Procedures,Mysqli,我正在写一个mysql/php广告系统 我有一个包含以下列的ads表 id、地点、城市、州、img、url、视图、点击 对于每个城市/州组合,每个广告点最多可以有6行 每个页面模板大约有15个独特的广告点 在页面加载时,我需要为模板中的每个点轮流抓取下一个广告,并增加它们的浏览量 到目前为止我所尝试的 我想为了减少数据库调用,我会使用一个存储过程,插入到尚未实现的状态下 此过程的工作原理是,对给定城市/州组合中与给定地点匹配的所有行的视图进行合计,将合计值除以匹配行数,然后使用剩余值确定要返回的

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

我有一个包含以下列的ads表

id、地点、城市、州、img、url、视图、点击

对于每个城市/州组合,每个广告点最多可以有6行

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

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

到目前为止我所尝试的

我想为了减少数据库调用,我会使用一个存储过程,插入到尚未实现的状态下

此过程的工作原理是,对给定城市/州组合中与给定地点匹配的所有行的视图进行合计,将合计值除以匹配行数,然后使用剩余值确定要返回的行

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

我想知道其他的选择

如果我用PHP进行处理并在事后递增,我假设我需要放弃余数选择方法,使用不太理想的随机选择方法来避免冲突

这样做明智吗

添加页面列 将城市/州组合中页面的所有可能广告返回到PHP。**将比显示的数量多6倍。 通过PHP随机选择要显示的广告 通过使用WHERE id IN子句更新这些选定行 还有其他建议吗


看起来你不需要使用临时表就可以做到这一点,你试过了吗?我想这可能会加快一点,也许不会太多,但它会加上几个连续的电话。感谢您的回复!我之所以需要temp表,是因为需要一种将多个选定行返回到PHP的方法。我还能怎么做呢?你不能使用类似的逻辑来获取要插入的行以便将它们返回到php吗?另外,我不认为将大量逻辑转移到PHP会降低性能,我认为您肯定会避免命令不同步问题,并使其更具可扩展性。唯一需要确保保持完整的部分是增加视图集views=views+1的线。在SQL中使用+运算符将确保同步事务期间的完整性。
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 //