如何向广告展示相同的次数?

时间:2010-12-10 11:17:34

标签: php database codeigniter

我正在建立自己的广告平台,我有一点问题。如何向广告展示相同的次数?

例如:

Name    |    Views

Ads 1   |    100

Ads 2   |    98

Ads 3   |    99

因此,我的系统需要显示观看次数最少的广告,在本例中为“广告2或广告3”。 因此,我的所有广告都遵循彼此的观点。因此,当我的3个广告总共有3.000个视图时,每个视图应该有1.000个视图。

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

2 个答案:

答案 0 :(得分:1)

选择您最不受欢迎的添加内容:

SELECT * FROM ads ORDERBY views ASC LIMIT 0, 1

这样,视图较少的所有广告都会慢慢赶上。

- 使用您的下一个要求编辑

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 :(得分:0)

我假设您有一个包含有关这些广告的信息的数据库表。如果您还没有,可以添加该表的views字段。然后,只要您需要展示广告,就可以抓住视图数量最少的广告,向其视图计数器添加1,然后展示广告。

编辑:

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

假设您的系统中有50个单独的广告。让我们也说你的最高得分记录得分为9.9 / 10,而你的第二高得分纪录得分为9.8 / 10。这两个都是非常高的得分项目,但是如果你使用@MarvinLabs代码,得分最高的记录将获得所有视图的30%,而得分第二高的得分记录将得到所有视图的1.4%(所有视图的70%被划分为49个非最高得分广告。)

您可能需要考虑的是允许包含更多范围的高得分广告。您可以通过以下三种方式之一完成此操作:

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

$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的广告,您将无法获得任何回报。因此,您可能不想使用此方法。

其次,您可以在前5或10个广告中传播30%的观看次数:

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没有内置的处理方法,因此您需要通过以下两种方式之一解决此问题:

一种方法是以懒惰的方式执行并运行两个查询 - 一个用于获取当前记录计数,另一个用于创建基于它的查询。例如:

$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"

更好的方法是避免第二次往返数据库并使用预先准备好的声明:

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;