问题描述
某系统根据用户的使用情况分发一些积分(有效期)给用户使用。使用的时候优先使用有效期内最小的积分
设计思路
数据库表 points表
id | user_id | points | valiad |
---|---|---|---|
1 | 1 | 5 | 2019-04-06 18:43:41 |
2 | 1 | 5 | 2019-04-06 18:43:43 |
例子 现在需要花费7积分 那么id为1的points变成0,id为1的points变成3
代码
- 计算出user_id为1的有效期的总积分和相应的主键id
SELECT SUM(points) AS money,GROUP_CONCAT(id) AS id FROM `points` WHERE user_id=1 AND time() < valiad
- 根据主键id算出每条对应的id 和 points
SELECT id,points FROM `Transaction` WHERE user_id=$userId AND points IN ($id)
- 使用foreach
$ subDiamond 是第二条的 结果。$sub 是需要花费的积分
foreach ($subDiamond as $k => $v) {
if ($sub > 0) {
if($v['points'] >= $sub){ #记录的积分大于要花费的 执行完后进行清0以免进入下面操作
$id = $v['id'];
$effective = $v['points'] - $sub;
#进行SQL操做
$sub = 0; #进行清0操作
}else{ #是计算每条钻石的记录小于要付的钻石量
$id = $v['id'];
#进行相应的SQL操作 使用完清0或者改变使用状态
$sub = $sub - $v['points']; #进行一回减去一回
}
}
}