参考博文链接:
https://www.jianshu.com/p/f42fd10845af
一、项目中 mapper文件里面碰到了 自定义用户变量,代码是这样的:
<select id="getOrgConvInfo" parameterType="com.soft.sdd.othermgr.thirdCount.model.OrgConvSituationModel" resultType="com.soft.sdd.othermgr.thirdCount.model.OrgConvSituationModel">
SELECT
@z:=(
SELECT COUNT(DISTINCT(t1.cust_no))
FROM t_visit_login_log t1,t_cust_info tci
WHERE t1.cust_no = tci.cust_no
AND tci.del_flag = '0'
AND t1.del_flag = '0'
<include refid="levelAndOrgCode"/>
AND DATE(t1.created_time) <#{endTime}
AND DATE(t1.created_time) >= '2019-01-01'
) AS totalCust,
@x:= COUNT(DISTINCT(tor.cust_no)) AS ljConvCust,
COUNT(DISTINCT(IF(DATE(tor.order_time)>=#{beginTime},tor.cust_no,NULL))) AS dyConvCust,
@y:=COUNT(DISTINCT(IF(DATE(tor.order_time) <#{beginTime},tor.cust_no,NULL))) AS qyljConvCust,
(@x-@y) AS dyIncreCust,
(@z-@x) AS ljNotConvCust,
SUM(IF(DATE(tor.order_time)>=#{beginTime},tor.cont,0)) AS dyConvGoods,
SUM(tor.cont) AS ljConvGoods
FROM t_order tor,t_cust_info tci
WHERE tor.cust_no = tci.cust_no
AND tor.order_stat_code IN ('6','8','10')
AND tor.del_flag = '0'
AND tci.del_flag = '0'
<include refid="levelAndOrgCode"/>
AND DATE(tor.order_time) <#{endTime}
AND DATE(tor.order_time) >= '2019-01-01'
</select>
映入眼帘的@x、@y、@z这些应该就是自己定义的用户变量了吧
之所以要这么写SQL语句,还是跟具体的业务有关,实现的功能如下图:
下面@x、@y以及@z的大致含义:
会员存量:@z:=totalCust
COUNT(DISTINCT(t1.cust_no))
累计兑换客户数量:ljConvCust
@x:=COUNT(DISTINCT(tor.cust_no)) AS ljConvCust
前月累计兑换客户数量:qyljConvCust
@y:=COUNT(DISTINCT(IF(DATE(tor.order_time) < #{beginTime},tor.cust_no,NULL)))
当月兑换客户数量:dyConvCust
COUNT(DISTINCT(IF(DATE(tor.order_time) >= #{beginTime},tor.cust_no,NULL)))
当月兑换商品数量:dyConvGoods
SUM(IF(DATE(tor.order_time) >= #{beginTime},tor.cont,0))
累计兑换商品数量;ljConvGoods
SUM(tor.cont) AS ljConvGoods
当月新增兑换人数:dyIncreCust = 当月累计 - 前月累计
(@x-@y) AS dyIncreCust
累计未兑换人数:ljNotConvCust = 会员总数 - 累计兑换客户人数
(@z-@x) AS ljNotConvCust
二、用户变量
1.简介
用户变量的作用域要比局部变量要广。用户变量可以作用于当前整个连接,但是当当前连接断开后,其所定义的用户变量都会消失。
用户变量使用如下(这里我们无须使用declare关键字进行定义,可以直接这样使用):
select @变量名
对用户变量赋值有两种方式,一种是直接用"=“号,另一种是用”:=“号。其区别在于使用set命令对用户变量进行赋值时,两种方式都可以使用;当使用select语句对用户变量进行赋值时,只能使用”:=“方式,因为在select语句中,”="号被看作是比较操作符。
SQL语句定义变量,如下:
SET @c = '2333';-- 定义变量并赋值
SELECT @c;-- 查询定义的变量的值
执行结果:
2333
那么如何在mybatis的框架实现变量的定义的呢?如果能实现变量的定义,那就可以在mybatis上写一定量的业务代码,也是不错的!
2.变量的定义及使用
<update id="updatePrice">
/*1.变量定义*/
select @isEnd:=0,@isFinish:=1;
/*2.使用变量*/
update Sc_Stock a set a.cost_price = 10 where @isFinish= 1 and @isEnd = 0;
</update>
2.变量的赋值
<update id="updatePrice">
/*1.变量定义*/
select @newPrice:=0;
/*2.变量赋值*/
update Sc_Stock a set a.price = @newPrice := 11 where a.id = 2222;
/*3.变量使用*/
update Sc_Stock a set a.num = 2 where @newPrice = 11;
</update>
3.变量使用小技巧
<update id="updatePrice">
/*1.变量定义*/
select @isFinish:=0;
/*2.变量使用*/
update Sc_Stock set num = 2 where newPrice = 11 and if(@isFinish = 0, 0, @isFinish := a.is_finish);
</update>
上方更新语句最后会变成:
update Sc_Stock set num = 2 where newPrice = 11 and 0;
或是
update Sc_Stock set num = 2 where newPrice = 11 and 1;
下面简单实现举例:
SELECT
@tt :=
( SELECT COUNT(1)
FROM t_daily td
WHERE td.del_flag = '0'
AND td.`dept_id` = 'Gc1dc367-L931-B52a-0389-0675b7085939'
AND td.create_time >= '2021-03-14 00:00:00'
AND td.create_time <= '2021-03-15 00:00:00' -- 3月14号团队所有日报个数
) AS team_total,
@ts :=
( SELECT COUNT(1)
FROM t_daily td
WHERE td.del_flag = '0'
AND td.daily_status = '2' -- 3月14日团队已提交日报个数
AND td.`dept_id` = 'Gc1dc367-L931-B52a-0389-0675b7085939'
AND td.create_time >= '2021-03-14 00:00:00'
AND td.create_time <= '2021-03-15 00:00:00'
) AS team_submit,
(@tt - @ts) AS team_not_submit_1, -- 3月14日团队未提交日报个数(包括驳回的日报) 方式1
@tn :=
( SELECT COUNT(1)
FROM t_daily td
WHERE td.del_flag = '0'
AND ( td.daily_status = '1' OR td.daily_status = '3' ) -- 3月14日团队未提交日报个数(包括驳回的日报) 方式2
AND td.`dept_id` = 'Gc1dc367-L931-B52a-0389-0675b7085939'
AND td.create_time >= '2021-03-14 00:00:00'
AND td.create_time <= '2021-03-15 00:00:00'
) AS team_not_submit_2
表数据部分截图:
查询结果: