首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算广告印象排名

计算广告印象排名
EN

Stack Overflow用户
提问于 2009-09-15 12:58:41
回答 3查看 360关注 0票数 1

我目前在一个数据库广告轮换系统中工作,其中一些广告比其他人有更高的印象(或排名),应该更频繁地显示。

在保持“随机”广告外观的同时,计算印象排名的最佳方法是什么?数据库的表结构是什么样子的?计算应该在数据库中完成还是在代码中完成?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-15 13:08:43

一些可能也有帮助的相关问题:

票数 1
EN

Stack Overflow用户

发布于 2009-09-15 13:04:04

这是一个很好的解决方案,它允许加权,它是coldfusion,但sql也是article

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2010-10-27 21:19:45

我们已经为我们的开源广告服务器AdServerBeans MyAds (http://www.adserverbeans.com)编写了一个MySQL函数,它在考虑流量份额的情况下随机选择横幅:

代码语言:javascript
复制
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存储过程/函数不支持数组/列表。因此,我们必须使用带有分隔符的字符串。在此函数中,请注意这一行:

代码语言:javascript
复制
SET rnd = RAND()*(total_traffic_share-1)+1;

它随机选择1到100之间的值。然后,我们查找位于该范围内的横幅。请注意,此算法可能适用于针对同一广告位置的少量广告。你可能会有一个不同的故事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1427029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档