我目前正在研究數據庫廣告輪播系統,其中一些廣告的展示次數(或排名)高於其他廣告,因此應該更頻繁地展示。計算廣告印象排名
什麼是計算印象等級的最佳方式,同時仍保持「隨機」廣告的外觀?數據庫的表結構是什麼樣的?應該在數據庫還是在代碼中進行計算?
我目前正在研究數據庫廣告輪播系統,其中一些廣告的展示次數(或排名)高於其他廣告,因此應該更頻繁地展示。計算廣告印象排名
什麼是計算印象等級的最佳方式,同時仍保持「隨機」廣告的外觀?數據庫的表結構是什麼樣的?應該在數據庫還是在代碼中進行計算?
一些相關的問題可能會有所幫助,以及:
這裏是一個很好的解決方案,它允許權重,它的的ColdFusion但SQL是有太多 article
DECLARE @girl TABLE (
id INT IDENTITY(1, 1),
name VARCHAR(50),
weight INT
);
INSERT INTO @girl
(
name,
weight
)(
SELECT 'Sarah', 100 UNION ALL
SELECT 'Libby', 30 UNION ALL
SELECT 'Lisa', 30 UNION ALL
SELECT 'Molly', 250 UNION ALL
SELECT 'Kit', 50
);
SELECT
g.id,
g.name,
g.weight
FROM
@girl g
INNER JOIN
(
--
--In this inner query, we need to select a random,
--weighted ID. We are doing this in the inner query
--rather than in the outter query so that our
--intermediary table doesn't need to contain so
--much information (just the ID).
--->
SELECT TOP 1
g.id
FROM
@girl g
INNER JOIN
pivot1000 p
ON
(
-- Use the weights. --->
g.weight >= p.id
--Use any additional filtering that is required by the business logic of the query criteria.
AND
g.name != 'Lisa'
)
ORDER BY
-- Select random row. --->
NEWID() ASC
) AS temp_id
ON
g.id = temp_id.id
我們已經寫了我們的開源廣告服務器AdServerBeans我的廣告(http://www.adserverbeans.com)一個MySQL的函數,選擇一個隨機的橫幅考慮到交通股份:
DELIMITER ;;
DROP FUNCTION if exists get_random_banner_by_traffic_share;
CREATE FUNCTION get_random_banner_by_traffic_share(valid_banners TEXT, total_traffic_share INTEGER)
RETURNS INTEGER
NOT DETERMINISTIC
BEGIN
DECLARE pos INTEGER DEFAULT 1;
DECLARE rnd INTEGER DEFAULT 0;
DECLARE current_traffic_share INTEGER DEFAULT 0;
DECLARE banner_id INTEGER;
DECLARE banner_traffic_share INTEGER;
SET rnd = RAND()*(total_traffic_share-1)+1;
WHILE pos < LENGTH(valid_banners) DO
SET pos = POSITION(';' IN valid_banners);
SET banner_id = CONVERT(SUBSTR(valid_banners,1,pos-1),SIGNED);
SET valid_banners=SUBSTRING(valid_banners FROM pos+1);
SET pos = POSITION(';' IN valid_banners);
SET banner_traffic_share = CONVERT(SUBSTR(valid_banners,1,pos-1),SIGNED);
SET valid_banners=SUBSTRING(valid_banners FROM pos+1);
if(current_traffic_share < rnd and rnd <= (banner_traffic_share+current_traffic_share)) THEN
RETURN banner_id;
END IF;
SET current_traffic_share=current_traffic_share+banner_traffic_share;
END WHILE;
END;
;;
delimiter ;
MySQL存儲過程/函數不支持數組/列表。所以我們不得不使用帶分隔符的字符串。 在這個函數中要注意行:
SET rnd = RAND()*(total_traffic_share-1)+1;
中隨機選取從1到100 我們然後尋找位於該範圍內的旗幟的值。 請注意,對於定位到相同廣告位置的少量廣告,此算法可能不錯。你可能會有不同的故事。
什麼都沒有,仍然在紙上素描。但我一直在努力研究如何計算排名。 – janhartmann 2009-09-15 13:03:05