mysql特殊用法

批量更新

优势:可以大大减少数据连接次数,提升程序处理速度;
劣势:sql语句较复杂,在修改字段过多时,还可能出现字符串超处理长度问题

UPDATE oa_role_staff 
SET role_id =
CASE
	staff_base_info_id 
	WHEN 1958 THEN 1 
	WHEN 2138 THEN 1 
	WHEN 2148 THEN 1 
END 
WHERE
	role_id = -1 
	AND staff_base_info_id IN ( 1958, 2138, 2148 );

实际应用中,一般结合mybatis中的foreach使用;例如:

<update id="batchUpdateStaffRole" parameterType="map">
    update
      oa_role_staff
    SET role_id =
    <foreach collection="staffInfoList" item="item" index="index"
             separator=" " open="case staff_base_info_id" close="end">
      when #{item.id} then #{targetRoleId}
    </foreach>
    where role_id = #{sourceRoleId} and  staff_base_info_id in
    <foreach collection="staffInfoList" index="index" item="item"
             separator="," open="(" close=")">
      #{item.id}
    </foreach>
  </update>

递归查询(有bug)

现在网上很多介绍递归查询,都是使用存储过程,可是现在很多项目是不推荐存储过程进行编码的,以下介绍不使用存储过程的不数据库递归查询
先上代码:

SELECT
   id 
FROM
   (
SELECT
   t1.id,
IF
   ( find_in_set( parent_id, @pids ) > 0, @pids := concat( @pids, ',', id ), 0 ) AS ischild 
FROM
   ( SELECT id, parent_id FROM oa_department t order by parent_id, id ) t1,
   ( SELECT @pids := 1 ) t2 -- 1为需要的递归的父id
   ) t3 
WHERE
   ischild != 0

过程中使用到的函数:
find_in_set(str,strList):
假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将无法正常运行。(引用:https://www.jianshu.com/p/b2c1ba0ba34f)
"@"的作用:用于标识变量(mysql中变量不用事前申明,在用的时候直接用“@变量名”使用就可以了)
":="的作用:select时的赋值.
IF(expr1,expr2,expr3):类似java的三元表达式: var result = expr1 ? expr2 : expr3(引用:https://www.cnblogs.com/zjdxr-up/p/8383609.html)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值