首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何才能将我的广告展示相同的次数?

我如何才能将我的广告展示相同的次数?
EN

Stack Overflow用户
提问于 2010-12-10 19:17:34
回答 2查看 227关注 0票数 0

我正在搭建我自己的广告平台,我有一个小问题。我如何才能将我的广告展示相同的次数?

举个例子:

代码语言:javascript
复制
Name    |    Views

Ads 1   |    100

Ads 2   |    98

Ads 3   |    99

所以我的系统需要显示浏览量最少的广告,在本例中是“ads2 or ads3”。所以我所有的广告都遵循彼此的观点。因此,当我的3个广告总共有3.000的浏览量时,每个浏览量应该有1.000的浏览量。

我用PHP编写代码,没有示例,因为我需要灵感来解决我的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-10 19:21:18

选择查看次数最少的add,如下所示:

代码语言:javascript
复制
SELECT * FROM ads ORDERBY views ASC LIMIT 0, 1

这样,所有浏览量较少的广告都会慢慢赶上。

--编辑,使用您的下一个需求

代码语言:javascript
复制
probabilityForHighestScore = 30;
random = rand(0, 100);

if (random > probabilityForHighestScore)
    SELECT * FROM ads ORDERBY views ASC LIMIT 0, 1
else
    SELECT * FROM ads ORDERBY score DESC LIMIT 0, 1

如果你还需要别的什么,你最好先解释一下你的整个需求。因为如果你不清楚,你的问题就不会清楚,答案也不会达到你想要的效果。

票数 1
EN

Stack Overflow用户

发布于 2010-12-10 19:22:17

我假设你有一个包含这些广告信息的数据库表。您可以向该表添加一个views字段(如果还没有)。然后,当您需要显示一个广告时,您只需抓取查看次数最少的一个,将其查看计数器加1,然后显示该广告。

编辑:

正如我在评论中解释的,@MarvinLabs解决方案的问题是,它给单个记录带来了巨大的奖金。

假设你的系统中有50个不同的广告。比方说你的得分最高的记录是9.9/10,第二高的得分记录是9.8/10。这两个都是得分很高的项目,但如果你使用@MarvinLabs代码,最高得分的记录将获得所有浏览量的30%,而第二高得分记录将获得所有浏览量的1.4% (在49个非最高得分的广告中,占所有浏览量的70%)。

你可能想要考虑的是允许更大范围的高得分广告被包括在内。您可以使用以下三种方法中的任何一种来执行此操作:

首先,您可以设置一个阈值或多个阈值,将一定百分比的视图划分为特定的分数范围。例如,你可以设置它,这样得分超过9/10的广告就会获得30%的浏览量。你可以这样做:

代码语言:javascript
复制
$random = rand(1,100);
if ($random > 30) {
  $sql = "SELECT * FROM ads WHERE score >= 9 ORDER BY views ASC";
} else {
  $sql = "SELECT * FROM ads WHERE score < 9 ORDER BY views ASC";
}

这样做的问题是,如果你没有任何得分高于9的广告,你将得不到任何回报。因此,您可能不想使用此方法。

其次,你可以将30%的浏览量分布在排名前5或10的广告中:

代码语言:javascript
复制
SELECT * 
FROM ads 
WHERE id IN 
   (SELECT id 
    FROM ads 
    ORDER BY score DESC 
    LIMIT 10) 
ORDER BY views ASC;

这解决了“如果我没有超过阈值的任何记录怎么办”的问题,同时仍然将“高分奖金”分散到多个记录中。这样做的问题是,如果你认为这是一个问题,那就是,它不能与你记录的广告量进行缩放。无论你有10条记录还是10,000条记录,你仍然会给10条(或20条,或50条)奖励。无论您设置了什么)记录。

如果您想要扩展,您将需要第三种解决方案。

第三种解决方案是根据表中记录总数的百分比设置限制。由于MySQL没有内置的方法来处理此问题,因此您需要通过以下两种方法之一来解决此问题:

一种方法是使用惰性方法并运行两个查询-一种是获取当前记录计数,另一种是基于该计数创建查询。例如:

代码语言:javascript
复制
$query1 = "SELECT COUNT(*) FROM ads";
//store result in $count
$percentage = round($count * 0.10); //get 10% of records
$query2 = "SELECT * FROM ads WHERE id IN " .
              "(SELECT id " .
              " FROM ads " .
              " ORDER BY score DESC " .
              " LIMIT " . $percentage . ") " .
          "ORDER BY views ASC"

更好的方法是避免对数据库的第二次往返,并使用预准备语句:

代码语言:javascript
复制
SELECT @percentage := ROUND(COUNT(*) * 10/100) FROM ads;
PREPARE PERCENTAGE FROM
   SELECT * 
   FROM ads 
   WHERE id IN
      (SELECT id FROM ads
       ORDER BY score DESC
       LIMIT ?)
   ORDER BY views ASC;
EXECUTE PERCENTAGE USING @percentage;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4408254

复制
相关文章

相似问题

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