一条update搞定积分兑换的问题
2016-04-12 12:07
197 查看
原型:假设用户的每一笔消费都会生成对应的积分,积分有一定的过期时间,用户兑换商品时需要按日期从小到大的顺序核销每一笔积分,且过期的积分不可用。
假设:现假设我们积分的过期时间是10天,用户兑换的商品价值80积分,当前时间为2016-04-12。
构造数据:
(1)创建表:
(2)插入数据:
假设表中数据的ID与创建时间是同增的。
(3)查询原始数据:
(4)预期:
根据上表中的数据,我们核销时应该是从2016-04-02那条记录也就是ID为2的开始核销,最后更新的列应该如下:
(5)执行更新:
(6)查询更新的结果:
可以看到与我们预期的完全一样。
(7)验证上述更新:
现在回到原始数据,假设ID为2的记录已经兑换了20个积分,ID为3的记录兑换了8个积分,那么新的原始数据如下:
执行更新后的结果如下:
验证:(2+40+15+23)=80,完全正确。
假设:现假设我们积分的过期时间是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的开始核销,最后更新的列应该如下:
id | create_time | point | used_point |
---|---|---|---|
2 | 2016-04-02 | 20 | 20 |
3 | 2016-04-02 | 10 | 10 |
4 | 2016-04-02 | 40 | 40 |
5 | 2016-04-02 | 15 | 10 |
update test_point_tl tp1 set tp1.used_point = case when tp1.id < @min_id then tp1.point when tp1.id = @min_id then 80 - @min_sum_point + point end where 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,完全正确。
相关文章推荐
- 设计模式六大原则(6):开闭原则
- Android蓝牙开发(一)
- 献给和我合作的过得前端童靴们:jquery源码分析--核心函数(使用函数作为参数创建jQuery对象)
- 可视化——matploblib 解决中文显示的问题
- Remix OS for PC
- 计算机图形学(一) 视频显示设备_7_光栅扫描系统
- C++ string与stringstream
- 你所不知道的继承(一)
- 在Linux中安装JDK的步骤
- Multipart/form-data POST文件上传详解
- android as2.0 播放器源码 支持 4.2+ 系统
- 排序-归并排序
- java 堆 栈 方法区的简单分析
- linux第七章读书笔记
- 限制UITextField输入长度
- Java入门 第二季第一章 类和对象
- jsp(2)
- 广度优先算法最短路径问题 Dijkstra算法
- Xcode各版本官方下载
- OC中创建字符串的几种方法及Xcode7.3中其存储内存地址的异同