mysql使用变量实现类似oracle中的lag函数功能
说明:
有一个订单表,每次下单都会记录是否使用了券,现模拟一个需求,将订单表插入日志表达到记录用户上一次是否用券以及此订单是否用券的情况
#--------实现:
#创建表t_order
create table t_order(id int,name varchar(50),time date);
#插入数据
insert into t_order values(1001,'用券','2019-04-01');
insert into t_order values(1002,'不用券','2019-05-10');
insert into t_order values(1001,'不用券','2019-05-01');
insert into t_order values(1003,'不用券','2019-04-12');
insert into t_order values(1001,'不用券','2019-05-11');
insert into t_order values(1002,'用券','2019-05-30');
insert into t_order values(1001,'不用券','2019-05-22');
insert into t_order values(1003,'用券','2019-05-24');
查看原数据
select * from t_order;
id name time
1001 用券 2019-04-01
1002 不用券 2019-05-10
1001 不用券 2019-05-01
1003 不用券 2019-04-12
1001 不用券 2019-05-11
1002 用券 2019-05-30
1001 不用券 2019-05-22
1003 用券 2019-05-24
#语句
SELECT base.id
,base.before_name
,base.name
,base.time
FROM (SELECT IF(@id = t.id, @lagname := @NAME, @lagname := '') AS before_name
,@id := t.id AS tid
,@NAME := t.name AS tafter_name
,t.*
FROM (SELECT *
FROM t_order
ORDER BY id
,TIME) t
,(SELECT @lagname := NULL
,@id := 0
,@NAME := NULL) r) base;
id before_name name time
1001 用券 2019-04-01
1001 用券 不用券 2019-05-01
1001 不用券 不用券 2019-05-11
1001 不用券 不用券 2019-05-22
1002 不用券 2019-05-10
1002 不用券 用券 2019-05-30
1003 不用券 2019-04-12
1003 不用券 用券 2019-05-24
注意:
1、order by排序很重要,它将决定取到的值是否正确;
版权声明:本文为debimeng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。