2009-09-15 62 views
1

我目前正在研究數據庫廣告輪播系統,其中一些廣告的展示次數(或排名)高於其他廣告,因此應該更頻繁地展示。計算廣告印象排名

什麼是計算印象等級的最佳方式,同時仍保持「隨機」廣告的外觀?數據庫的表結構是什麼樣的?應該在數據庫還是在代碼中進行計算?

+0

什麼都沒有,仍然在紙上素描。但我一直在努力研究如何計算排名。 – janhartmann 2009-09-15 13:03:05

回答

2

這裏是一個很好的解決方案,它允許權重,它的的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 
0

我們已經寫了我們的開源廣告服務器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 我們然後尋找位於該範圍內的旗幟的值。 請注意,對於定位到相同廣告位置的少量廣告,此算法可能不錯。你可能會有不同的故事。