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,感觉这个不是好