我正在建立一个使用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次点击。它不会落后于计划。
答案 0 :(得分:1)
不需要列period
。将end_time
和start_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,当它已经完成时