使用MySQL限制每天发送的访问者

时间:2016-12-26 21:22:39

标签: php mysql sql

我正在建立一个使用PHP和MySQLi的网站。该网站向其他网站所有者出售流量。这是我的表格结构,用于监控有效的广告系列:

id  url                     hits_ordered    hits_sent   status
1   http://google.com       1000            120         'Active'
2   http://facebook.com     3000            2421        'Inactive'
3   http://yahoo.com        400             12          'Active'

我想要做的是让人们可以选择在1-90天内进行点击,这样他们就不会立刻被他们淹没。所以,我打算将结构更改为:

id  url                     hits_ordered    hits_sent   period      status
1   http://google.com       1000            120         25          'Active'
2   http://facebook.com     3000            2421        20          'Inactive'
3   http://yahoo.com        400             12          60          'Active'

period代表广告系列应分散的天数。

但我认为最好再添加两列,一列可以显示广告系列的开始时间(start_time)以及广告系列应该何时完成(end_time )。

如果我有开始和结束列,是否有任何方法可以使用MySQL来数学计算广告系列是否落后于计划并选择它?

例如,如果某人订购10,000次点击并希望在5天内发送。如果在第4天,他们只有2000次点击,显然它会落后于时间表"因为它应该有8000-10000次点击。

我知道我可以用PHP计算这个。我只想弄清楚是否有办法用纯粹的MySQL来选择所有落后于计划的行。

似乎应该有一种查询这些行的方法,因为MySQL可以执行数学运算,知道发送的总命中数,总数量顺序以及开始/结束日期。

=====

以下@ICE的另一个例子。这一行将落后于计划:

id  url                     hits_ordered    hits_sent   start_date              end_date
1   http://google.com       1000            5           2016-12-23 00:00:00     2016-12-28 00:00:00

它落后了,因为自23日订购以来只发送了5次点击。现在是25日,结束于28日。因此,根据我上面的逻辑,应该考虑"落后于计划"。

这一行不会是:

id  url                     hits_ordered    hits_sent   start_date              end_date
1   http://google.com       1000            999         2016-12-23 00:00:00     2016-12-28 00:00:00

在此示例中,日期相同,但已发送了999个我们的1000次点击。它不会落后于计划。

2 个答案:

答案 0 :(得分:1)

不需要列period。将end_timestart_time设为DATETIME。之后,您可以使用jsbin选择它们。它返回两个日期之间的差异:

select * from TABLE where
datediff(end_time,start_time) > datediff(now(),start_time) and
datediff(now(),start_time)>3 and //just select rows with more than 3 days after start_time. This can help to have more logical result as you want
hits_sent + (datediff(end_time,now()) * (hits_send/datediff(now(),start_time))) + 20 < hits_ordered //means count hits happened + we guess this much hits can happen on remaining days based on the remaining days and hits_send + fluctuation < what they ordered

<强>解释

到目前为止每天点击次数

hits_send/datediff(now(),start_time)
剩下的几天

datediff(end_time,now())

根据前几天发生的事情,我们可以猜测这可能会在剩下的几天内发生命中

(datediff(end_time,now()) * (hits_send/datediff(now(),start_time))) + 20

+20是波动。我们猜想有一天他们可能会有20次点击。

答案 1 :(得分:1)

如果hits_sent的百分比高于campain持续时间百分比的百分比,则可以比较剩余命中的百分比和campain的天数百分比,只需使用bool expresion禁用它。

select *,((hits_sent/hits_ordered)<datediff(now(),start_date)/datediff(end_date,start_date)) as active, (((hits_sent/hits_ordered))/(datediff(now(),start_date)/datediff(end_date,start_date)) ) as status from orders where 1 order by active desc

SQLFIDDLE给出活动或不活动,并给你一个数字,表示该营地是否按计划(接近1)低于计划(接近1)和高于1,当它已经完成时