一条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的开始核销,最后更新的列应该如下:

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

(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
原创粉丝点击