例:500积分,分5次返还(即每次100),5天返还一次
思路:
数据库结构:statusnumbertime状态剩余数值最近一次返还时间方法:每天固定时间执行cron,查询状态为开始返还(1)的记录,判断当前时间和记录的time是否超过5天,如果超过就把number减去100,并更新time,再判断number是否为0,如果为0,更新status为返还完成(0)。
问题:
不了解解决这类问题的最佳方法,这只是自己按流程走想到的,请大神指导。
应该还有一张为用户加积分的表,这里我大概说下我的思路
1、status,time字段加联合索引
2、先算出time超过5天的时间,如$time=date("Y-m-dH:i:s",strtotime("-5days"));
mysql:开启事务
3、根据这个时间和status=1作为条件去查询
"selectuserfromtablenamewherestatus=1andtime<'{$time}'limit100";
//先查询需要给用户加积分的用户,然后再去减积分
4、为用户添加积分(这里不作说明具体不知道你的另一张表是什么样的)
这里用了limit主要是为了防止数据过大,一次查询太多会慢
3、4步完成后再接着走下面,记住事务不能断
5、然后根据这个时间和status=1作为条件去修改积分(先扣除后再修改状态)
"updatetablenamesetnumber=number-100wherestatus=1andtime<'{$time}'";
6、查询status=1andnumber=0的修改状态为0
"updatetablenamesetstatus=0,time='当前时间'wherestatus=1andnumber=0;
mysql:关闭事务