一条update搞定积分兑换的问题
来源:互联网 发布:关于知止的事例 编辑:程序博客网 时间:2024/04/27 14:34
原型:假设用户的每一笔消费都会生成对应的积分,积分有一定的过期时间,用户兑换商品时需要按日期从小到大的顺序核销每一笔积分,且过期的积分不可用。
假设:现假设我们积分的过期时间是10天,用户兑换的商品价值80积分,当前时间为2016-04-12。
构造数据:
(1)创建表:
create table test_point_tl( id int, create_time datetime, point int, used_point int default 0);
(2)插入数据:
假设表中数据的ID与创建时间是同增的。
insert into test_point_tl(id, create_time, point) values(1,'2016-4-1', 10);insert into test_point_tl(id, create_time, point) values(2,'2016-4-2', 20);insert into test_point_tl(id, create_time, point) values(6,'2016-4-5', 30);insert into test_point_tl(id, create_time, point) values(5,'2016-4-4', 15);insert into test_point_tl(id, create_time, point) values(4,'2016-4-3', 40);insert into test_point_tl(id, create_time, point) values(3,'2016-4-2', 10);
(3)查询原始数据:
select * from test_point_tl order by create_time asc;
(4)预期:
根据上表中的数据,我们核销时应该是从2016-04-02那条记录也就是ID为2的开始核销,最后更新的列应该如下:
(5)执行更新:
update test_point_tl tp1set tp1.used_point = case when tp1.id < @min_id then tp1.point when tp1.id = @min_id then 80 - @min_sum_point + point endwhere tp1.create_time >= date_sub(current_date(), interval 10 day)and tp1.id <= (select min_id from ( select @min_id := min(tl.id) min_id, @min_sum_point:=min(tl.sum_point) from ( select tp.*, @value := @value + point-used_point sum_point from test_point_tl tp, (select @value := 0 from dual) r where tp.create_time >= date_sub(current_date(), interval 10 day) order by tp.create_time asc ) tl where tl.sum_point >= 80 ) tt );
(6)查询更新的结果:
可以看到与我们预期的完全一样。
(7)验证上述更新:
现在回到原始数据,假设ID为2的记录已经兑换了20个积分,ID为3的记录兑换了8个积分,那么新的原始数据如下:
执行更新后的结果如下:
验证:(2+40+15+23)=80,完全正确。
0 0
- 一条update搞定积分兑换的问题
- 关于CSDN上面的积分奖品兑换区的问题
- 积分兑换
- 积分兑换
- 积分兑换
- 兑换积分
- 积分兑换
- 积分兑换
- 兑换积分
- [转] csdn积分兑换的地方
- 一条update的过程
- 可用积分兑换下载积分
- CSDN积分兑换
- 积分兑换URL
- CSDN兑换积分
- csdn积分兑换地址
- CSDN兑换积分
- 下载积分兑换频道
- Remix OS for PC
- 可视化——matploblib 解决中文显示的问题
- Android蓝牙开发(一)
- 闭包的用途
- 设计模式六大原则(6):开闭原则
- 一条update搞定积分兑换的问题
- VR/AR工作原理、目前存在的技术问题
- Android ListView性能优化实战方案
- C++ 和Matlab混合编程一些问题:如何让matlab不打开新的command windows窗口
- Xcode 静态库调试策略
- java学习笔记之位运算
- C#颜色和名称样式对照表
- android 6.0运行时新权限的申请(转载)
- NKOJ 2151【单调队列】烽火传递 单调队列优化DP