Я управляю сайтом регистрации, которому нужны некоторые новые функции для наших агентов.Мы пытаемся выполнить следующие действия:
- За каждые 3 участника и агента он получает подарочную карту (электронное письмо, отправленное администратору для рассылки)
- Для 10 заявокв месяц агент получает свои маркетинговые материалы бесплатно в течение года (помечается в наших изменениях в БД)
- При 25 общих зачислениях в любое время агент получает свои маркетинговые материалы бесплатнов течение года
У меня нет проблем с созданием действий, которые происходят ПОСЛЕ того, как критерии выполнены (просто скрипт php запускается из задания cron).
Однако проблема, с которой я сталкиваюсь, заключается вразница во мнениях с другими членами моей команды.В конце каждой регистрации создается регистрационная запись участника с несколькими переменными, включая memberID и agentID.
По сути, они хотят запросить таблицу регистрации участников для задания cron на основе общего количества записей для данного agentID за заданный период времени.Однако проблема, которую я вижу, заключается в том, что задание cron не знает, что искать или как обрабатывать действия в цикле.
Например, предположим, что наша таблица выглядит следующим образом (упрощенно, заголовки впервый ряд):
memberid agentid date_enrolled
12345 7 2010-10-17 12:00:00
39283 3 2010-10-17 12:00:00
33839 4 2010-10-17 12:00:00
44848 7 2010-10-18 12:00:00
38383 5 2010-10-17 12:00:00
38383 7 2010-10-19 12:00:00
Исходя из вышеизложенного, если еженедельное задание cron было выполнено, было бы обнаружено, что AgentID 7 является подарочной картой, поскольку он зарегистрировал 3 участника в течение текущей недели.Если бы я смотрел на это с точки зрения отдельного запроса, у меня не было бы проблем с построением, но, учитывая, что у нас более 300 агентов, и информация может сильно различаться, я не знаю, сработает ли «нужный метод».
Если бы это был мой путь, я думаю Я бы строил новую таблицу со счетчиком каждый раз, когда происходило зачисление, а затем просто создавал бы задания хрон, чтобы очистить целые столбцы после прохождения временного барьера (каждую неделю, очисткастолбец 2 и счетчик перезапусков, каждый месяц, очистить столбец 3 и счетчик перезапусков).
Есть ли способ построить скрипт и задание cron так, как хочет наша команда?
РЕДАКТИРОВАТЬ 1:
Исходя из требований команды, я полагаю, что мой предложенный sql-запрос будет содержать несколько длинных строк:
SELECT COUNT(AGENT) FROM tablename GROUP BY AGENT WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 7 DAY)
РЕДАКТИРОВАТЬ 2:
Не получаю много любви здесь;) Я решил сделать мой запрос более строгим, но мне трудно разобрать результаты, которые я первоначально думал, будет легко.Мне нужно использовать результаты, возвращаемые одним запросом в другой.
Цель: выбрать все из таблицы, в которой данные регистрации превышают 7 дней назад, сгруппировать по номеру оператора, имеющему число больше 3. Как только результатывозвращено, обновить поле уникального флага для КАЖДОЙ записи агента, возвращенной в наборе результатов из предыдущего запроса.
Мой начальный код:
$sql = $db->query("SELECT * FROM tablename WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 7 DAYS) GROUP BY agentid HAVING COUNT(*) >= 3");
$result = $sql->fetchALL(PDO::FETCH_ASSOC);
foreach($result as $key=>$val) {
echo $key.' - '.$val.'<br />';
}
РЕДАКТИРОВАТЬ 3 - "окончательный" сценарий?
<?php
try {
$db = new PDO('mysql:host=localhost;dbname=database', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$sql = $db->query("SELECT AGENT FROM tablename WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 1 WEEK) GROUP BY AGENT HAVING COUNT(*) >= 10 ORDER BY enroll_date ASC");
$result = $sql->fetchALL(PDO::FETCH_ASSOC);
foreach($result as $key=>$val) {
foreach($val as $ball=>$face) {
echo $ball." - ".$face.'<br />';
$sql2 = "UPDATE tablename2 SET bonus_set=?, method=? WHERE agentID = '$face'";
$stmt = $db->prepare($sql2);
$stmt->execute(array("Y", "free"));
//NEED TO FIGURE OUT HOW TO EMAIL THE ENTIRE LIST TO MYSELF next...
}
}
$db->commit();
$db->null;
exit;
}
catch (PDOException $e)
{
$db->rollback();
echo $e->getMessage();
exit;
}
?>