积分返还算法求解

例: 500积分,分5次返还(即每次100),5天返还一次

思路:

数据库结构:
    status    number      time
    状态      剩余数值      最近一次返还时间
    
方法:
    每天固定时间执行cron,查询状态为开始返还(1)的记录,判断当前时间和记录的time是否超过5天,如果
    超过就把number减去100,并更新time, 再判断number是否为0,如果为0,更新status为返还完成(0)。
    
    

问题:

不了解解决这类问题的最佳方法,这只是自己按流程走想到的,请大神指导。
阅读 2.9k
1 个回答

应该还有一张为用户加积分的表,这里我大概说下我的思路

1、status,time字段加联合索引
2、先算出time超过5天的时间,如$time = date("Y-m-d H:i:s", strtotime("-5 days"));
mysql:开启事务
3、根据这个时间和status=1作为条件去查询

"select user from tablename where status=1 and time<'{$time}' limit 100";

// 先查询需要给用户加积分的用户,然后再去减积分
4、为用户添加积分(这里不作说明具体不知道你的另一张表是什么样的)


这里用了limit主要是为了防止数据过大,一次查询太多会慢
3、4步完成后再接着走下面,记住事务不能断


5、然后根据这个时间和status=1作为条件去修改积分 (先扣除后再修改状态)

"update tablename set number=number-100 where status=1 and time<'{$time}'";

6、查询status=1 and number=0的修改状态为0

"update tablename set status=0, time='当前时间' where status=1 and number=0;

mysql:关闭事务

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题