我正在建立自己的广告平台,我有一点问题。如何向广告展示相同的次数?
例如:
Name | Views
Ads 1 | 100
Ads 2 | 98
Ads 3 | 99
因此,我的系统需要显示观看次数最少的广告,在本例中为“广告2或广告3”。 因此,我的所有广告都遵循彼此的观点。因此,当我的3个广告总共有3.000个视图时,每个视图应该有1.000个视图。
我用PHP编码,我没有例子,因为我需要灵感来解决我的问题。
答案 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;