1

私はmysql/php広告システムを書いています

次の列の広告テーブルがあります

id、spot、city、state、img、url、views、clicks

各広告の「スポット」には、「都市/州」の組み合わせごとに最大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