mysql存储过程中in条件多个值,使用临时表解决

select  IFNULL(GROUP_CONCAT(id_batch),'-1') into  V_ID_BATCH from (
        select id_batch from tableA
)aa;

 select * from TABLE_STATUS WHERE  ID_BATCH IN ( V_ID_BATCH );

后来发现这个V_ID_BATCH 外面带了引号,被当成一个字符串了,而不是逗号分隔的多个值。为了避免拼接sql,可以使用find_in_set,但是find_in_set不会走索引而全表扫描,如果表比较大会特别慢,几秒钟的样式。为了能使用索引,我使用了临时表。临时表是会话基本的,只存在当前数据库连接对象中,连接断开自动清理。不同连接对象之间不会冲突。

DROP TEMPORARY TABLE IF EXISTS TMP_ID_SUB_BATCH  
CREATE TEMPORARY TABLE TMP_ID_SUB_BATCH  select id_batch from ( select id_batch from tableA )aa; 

 select * from TABLE_STATUS WHERE  ID_BATCH IN ( select * from TMP_ID_SUB_BATCH  );

临时表是局部临时表只存在于单个数据库连接对象中,也就是两个数据库连接可以建立同名的临时表,而且互相隔离不冲突。同一个连接的多次访问可以获取到同一个临时表,连接断开后临时表自动清理。

不使用临时表的话还有三种思路:

 一是使用游标,遍历游标中处理单个值;

二是按逗号切割成数组,遍历数组处理单个值

三是使用动态拼接sql,感觉这个不是好

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值