Mybatis 使用 @变量名:= 自定义 用户变量

参考博文链接:
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) &lt;#{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) &lt;#{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) &lt;#{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  

表数据部分截图:
在这里插入图片描述
查询结果:
在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值