记一次业务需要连表查询并LIKE需要匹配多个条件。
业务是需要把表1中的查询结果集的每一个结果都去作为表2的like条件。如果使用like ‘%x%’ or like ‘%x%’ …没多个之后效率就会非常低,而且我发现sql还不能将一个子查询的结果集都作为like的条件。如果每次like‘%x%’写一个条件,这样把每个条件都走一遍实在太麻烦了,所以去查了一下存储过程,正好放在这以后自己还需要回来改一改就好。
注:这个存储过程也是参考网上资料做的。##后面的注解是我写的,–后面的注解是原来的,不用看,因为有些东西没有了,是看不懂的
DROP PROCEDURE IF EXISTS init_reportUrl;
CREATE PROCEDURE init_reportUrl()
BEGIN
## 定义变量
--DECLARE s int DEFAULT 0;
DECLARE ss varchar(255);
DECLARE done INT DEFAULT FALSE;
## 定义游标,并将sql结果集赋值到游标report中
DECLARE report CURSOR FOR SELECT DISTINCT signName FROM `database`.table ;
##声明当游标遍历完后将标志变量置成某个值
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
## 打开游标
open report;
##开启游标循环
cur_loop:LOOP
-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致
## 变量需要在开启右表循环里面赋予 <b>也就是将结果/游标report每一次放到ss中去</b>
fetch report into ss;
## 执行业务逻辑
insert into tablename1 SELECT id FROM tablename2 WHERE content LIKE concat('%',ss,'%');
## ss会使用每次遍历游标得来的值。
-- 将游标中的值再赋值给变量,供下次循环使用;
-- 当s等于1时表明遍历以完成,退出循环
IF done THEN
LEAVE cur_loop;
END IF;
END LOOP;
-- 关闭游标
close report;
END;
##调用这个存储过程,上面的全部运行一遍,再来运行这一行
call init_reportUrl()
根据我的测试使用这个存储过程的话,%前后匹配的时间是一样的,’%x%'和’x%'的速度是差不多的,几千万的数据都是用来7200s左右。具体走没走索引没有去检测
初学者 。欢迎大佬剔除错误。