2016-12-26 38 views
0

我正在設置一個使用PHP和MySQLi的網站。該網站將流量銷售給其他網站所有者。這裏是我的表,監控有效的廣告系列結構:使用MySQL限制每天發送的訪問者數

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天內交付。如果在第四天,他們只有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

它與你所問的內容無關,但'status'類型對數據庫規範化非常不利。如果它只有活躍和不活躍的價值最好是BOOLEAN。 – ICE

回答

1

如果hits_sent的百分比高於活動持續時間百分比的百分比,只需使用bool表達式將其禁用即可比較剩餘匹配的百分比和競選日的百分比。

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得到活性或不campain,給你一個數字,代表如果官賤對決是按期(接近1)所示的時間表(接近0°)和上述圖1,當其已經完成

+0

太棒了!正是我在找什麼! – Andrew

1

不需要列period。創建end_timestart_timeDATETIME。之後,您可以選擇datediff。它返回天兩個日期之間的區別:

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()) 

隨着天發生了什麼事之前現在我們可以猜測這可能會有很多appen在剩餘的日子裏

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

+20是波動。我們猜測也許有一天他們可以有更多的20次點擊。

+0

那麼這幾乎只是跟蹤廣告系列是否應該激活。我想要做的是選擇BEHIND計劃的廣告系列。 – Andrew

+0

'hits_sent'將始終小於或等於'hits_ordered'。我只需要選擇一個廣告系列是否確實落後於其時間表,就像我原始帖子中的示例一樣。 – Andrew

+0

@Andrew編輯我的答案。它會按計劃選擇你要求的內容。我沒有測試它,只是寫在這裏。我希望這個對你有用。 – ICE