我正在搭建我自己的广告平台,我有一个小问题。我如何才能将我的广告展示相同的次数?
举个例子:
Name | Views
Ads 1 | 100
Ads 2 | 98
Ads 3 | 99所以我的系统需要显示浏览量最少的广告,在本例中是“ads2 or ads3”。所以我所有的广告都遵循彼此的观点。因此,当我的3个广告总共有3.000的浏览量时,每个浏览量应该有1.000的浏览量。
我用PHP编写代码,没有示例,因为我需要灵感来解决我的问题。
发布于 2010-12-10 19:21:18
选择查看次数最少的add,如下所示:
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如果你还需要别的什么,你最好先解释一下你的整个需求。因为如果你不清楚,你的问题就不会清楚,答案也不会达到你想要的效果。
发布于 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%的浏览量。你可以这样做:
$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的广告中:
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;https://stackoverflow.com/questions/4408254
复制相似问题