私はmysql/php広告システムを書いています
次の列の広告テーブルがあります
id、spot、city、state、img、url、views、clicks
各広告の「スポット」には、「都市/州」の組み合わせごとに最大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 //