Использование MySQL для ограничения посетителей, отправленных в день

132
11

Я настраиваю сайт, который использует 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

Это потому, что было отправлено только 5 хитов, так как было заказано 23-го. Это теперь 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 хитов были отправлены. Это не будет отставать от графика.

спросил(а) 2021-01-25T13:28:00+03:00 4 месяца, 2 недели назад
1
Решение
63

Нет необходимости в колонке period. Создайте end_time и start_time как DATETIME. после этого вы можете выбрать их с датиффом. Он возвращает разницу между двумя датами в днях:

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 хитов.

ответил(а) 2021-01-25T13:28:00+03:00 4 месяца, 2 недели назад
62

Вы можете сравнить процент оставшихся обращений и процент дней пребывания в кемпане, если процентная доля hits_sent превышает процентное соотношение процента продолжительности лагеря, просто отключите его с помощью 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 выдает активный или не campain и дает вам число, которое представляет, если campain находится по расписанию (около 1) ниже графика (около 0) и выше 1, когда его уже завершено

ответил(а) 2021-01-25T13:28:00+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема