我管理的注册网站需要为我们的代理商提供一些新功能。我们要完成的工作如下:
我在创建符合条件后发生的操作时没有问题(只需运行cron job的php脚本)。
然而,我面临的问题是与我的团队其他成员的意见分歧。在每次注册结束时,会使用许多变量创建成员注册记录,包括memberID和agentID。
基本上,他们希望根据给定agentID在一段时间内的记录总数来查询成员注册表中的cron作业。然而,我看到的问题是,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个代理并且信息可能差别很大,我不知道“所需方法”是否有效。
如果是我的方式,我想每次发生注册时我都会用计数器构建一个新表,然后只需创建一个chron作业,一旦时间障碍通过就清除整个列(每个一周,清除第2列并重新启动计数器,每个月,清除第3列并重新启动计数器)。
有没有办法以我们团队想要的方式构建脚本和cron作业?
根据团队的要求,我相信我提出的SQL查询会有很长的路要走:
SELECT COUNT(AGENT) FROM tablename GROUP BY AGENT WHERE enroll_date > DATE_SUB(CURDATE(),INTERVAL 7 DAY)
在这里没有得到很多的爱;)我决定让我的查询更加严格,但我很难解析出我最初认为很容易的结果。我需要将一个查询返回的结果用于另一个查询。
目标: 从注册数据大于7天前的tablename中选择all,按剂量编号大于3的组进行分组。返回结果后,更新上一个查询的结果集中返回的EACH代理记录的唯一标志字段。
我的初始代码是:
$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 />';
}
<?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;
}
?>
答案 0 :(得分:0)
建议的查询可以正常工作,只需将GROUP BY AGENT
移动到最后即可进行微小的更改。第二和第三条规则将采用相同的模式。
您可以在单独的表格(代理人,奖励,日期)中跟踪奖励,以避免像Mon-Sun有资格的情况,再到Tues-Mon的再次计算(重复计算重叠日期)。可以在这些表上运行联接,也可以只是单独的查询,以查看代理是否已在过去七天内获得礼品卡,等等。