Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql:根据另一个表中的信息替换一个表中的字符串_Mysql_Sql_String_Sql Update_Str Replace - Fatal编程技术网

Mysql:根据另一个表中的信息替换一个表中的字符串

Mysql:根据另一个表中的信息替换一个表中的字符串,mysql,sql,string,sql-update,str-replace,Mysql,Sql,String,Sql Update,Str Replace,我有下面的问题,这将是一个很长的问题,我想在我的问题中准确地说出我所知道的关于我的问题的一切 我有一个表,field_body_value,有两个字段,body_value和body_summary,包含格式为/webfm_send/where is a number的字符串 我有另一个名为webfm_file的表,其中有两个字段,其中包含字符串替换的信息:第一个字段名为fid,它是我前面提到的数字,第二个字段名为fpatch,并给出一个字符串,其中包含instance/data/html/fi

我有下面的问题,这将是一个很长的问题,我想在我的问题中准确地说出我所知道的关于我的问题的一切

我有一个表,field_body_value,有两个字段,body_value和body_summary,包含格式为/webfm_send/where is a number的字符串

我有另一个名为webfm_file的表,其中有两个字段,其中包含字符串替换的信息:第一个字段名为fid,它是我前面提到的数字,第二个字段名为fpatch,并给出一个字符串,其中包含instance/data/html/files/file1.pdf的路径,该路径必须替换第一个表中的/webfm_send/。数字在webfm_文件的记录上增加,但有跳跃,也就是说,它们增加了,但丢失了,因此最终的数字不等于webfm_文件中的记录数

所以我认为策略是建立一个在第二个表上循环的过程,在序列的每一步检索fid/fpath对,在第一个表中搜索/webfm_send/fid,并在第一个表中用fpath替换它

因此,这是我所能达到的编码:

BEGIN
  DECLARE v1 INT DEFAULT 0;
  SELECT COUNT(*) INTO @numrec FROM `webfm_file`;
  WHILE v1 < @numrec DO
    SELECT fpath,fid INTO @path,@file FROM `webfm_file` LIMIT v1,1;
    SET @webfm = concat('/webfm_send/',@file);
    SET @cpath = concat('/',@path);
    UPDATE `field_data_body`
    SET body_value = replace(body_value, @webfm, @cpath),  
    body_summary = replace(body_summary, @webfm, @cpath)
    WHERE body_value LIKE concat('%',@webfm,'%') OR 
    body_summary LIKE concat('%',@webfm,'%');
    SET v1 = v1 + 1;
  END WHILE;
END
让我解释一下我认为我在用上面的代码做什么:

1我检索循环的webfm_文件中的记录数

2第一个选择从webfm_文件的fpath/fid中获取一对,限制为v1,1我一次只检查一条记录,我检查了一条记录,它正常工作,while循环遍历webfm_文件的每条记录,并且正确检索记录

3下一组修复了@file/@path这对字符串,以创建@webfm,这是它在body_值字段中写入body_值的方式,并在@cpath前面加一个斜杠,这是我需要这个字符串最终出现的方式

4然后是更新,如果它在字段\u body\u数据的body\u值或body\u摘要中找到该字符串,它将实际替换该字符串

预期:webfm_send/的每个实例都被webfm_文件中fid的对应fpath对替换

我实际得到的结果是:在webfm_文件的记录1中,/webfm_send/的所有外观(无论的值是多少)都被fpath的值替换

我尝试过的事情:

我在UPDATE语句中去掉WHERE子句,我认为这不是绝对必要的,因为replace函数已经负责查找匹配项,但可以加快速度。同样的结果

2在webfm_文件的单个记录上重新强制循环。在这里,它用于替换字段\u body\u data中body\u value和body\u summary的两个实例中相应的单检索对fid/fpath,其中fid=出现在字符串webfm\u send中/


感谢您一直遵循我的解释,并提前感谢您的提示。

您可以使用光标在替换字符串上进行迭代。使用group_concat有更快的方法,使用通用语言比使用存储过程更容易。一般的方法是:

drop procedure if exists proc;
delimiter //

create procedure proc()
begin
  declare done boolean default 0;
  declare path varchar(255);
  declare id int;
  declare cur cursor for select fpath, fid from webfm_file order by fid desc;
  declare continue handler for sqlstate '02000' set done = 1;

  open cur;

  block: loop
    fetch cur into path, id;

    if done then
      leave block;
    end if;

    set @from = concat('/webfm_send/', id);

    update field_data_body set
      body_value = replace(body_value, @from, path),
      body_summary = replace(body_summary, @from, path);
  end loop;

  close cur;
end//

delimiter ;

call proc();

谢谢jspcal,但是你的程序和我的完全一样。它用webfm_文件中路径的第一条记录的值替换@fromin field_data_body的所有实例。如果我把SELECT@from;选择路径;然后我看到例程在正确的值上迭代,但不知怎么的,在UPDATE子句@from中,所有的实例都被正确迭代了webfm\u send\都找到了,但路径没有。这很奇怪-它对我有效。您的问题可能是字符串/webfm_send/1也匹配以1、10、11等开头的任何ID,因此最终也将替换这些ID。要解决这个问题,请按fid降序选择路径条目。再次感谢jspcal,就这样!如此愚蠢以至于看不到webfm_send/1也与webfm_send/11、webfm_send/111和webfm_send/1111匹配。但是,由于这些字符串出现在字段\u body\u数据中,并用引号括起来,所以将匹配项更改为webfm\u send\就很容易了,而且成功了。无论如何,结论是您的代码和我的代码的工作方式完全相同,虽然您的代码更优雅,但不会更快。它们都有完全相同的循环。最后,我想知道,如果两个表合并而没有循环,是否也能实现同样的效果。