php - 积分返还算法求解

 云沏-茶 发布于 2022-11-28 11:40

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

思路:

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

问题:

不了解解决这类问题的最佳方法,这只是自己按流程走想到的,请大神指导。
1 个回答
  • 应该还有一张为用户加积分的表,这里我大概说下我的思路

    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:关闭事务

    2022-11-28 11:41 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有