仅当不包含给定部分时才替换部分URL

时间:2015-07-20 22:17:55

标签: mysql phpmyadmin

我需要将包含31.media.tumblr.com的所有网址替换为41.media.tumblr.com。但是,如果网址31.media.tumblr.com中包含.gif,则不得更改。

这是我的代码;但它会更改所有内容,其中包含.gif的网址...当我运行它时:

UPDATE wp_posts 
    SET post_content 
      = REPLACE(post_content
               ,'31.media.tumblr.com/'
               ,'41.media.tumblr.com/') 
    WHERE post_content LIKE '%31.media.tumblr.com/%' 
      AND post_content NOT LIKE '%.gif';

P.S。这里有一个31. url的例子,最后有gif

https://31.media.tumblr.com/79db8c1df4f893bc20d53063e03834f6/tumblr_n1e93kMh3z1rjbi2lo1_500.gif

2 个答案:

答案 0 :(得分:2)

您的查询看起来很好,我认为问题是post_content中的尾随空格。尝试:

UPDATE wp_posts 
    SET post_content 
      = REPLACE(post_content
               ,'31.media.tumblr.com/'
               ,'41.media.tumblr.com/') 
WHERE post_content LIKE '%31.media.tumblr.com/%' 
  AND rtrim(post_content) NOT LIKE '%.gif';

看看是否有帮助。测试用例:

create table wp_posts (post_content varchar(255));
insert into wp_posts 
values ('https://31.media.tumblr.com/79db8c1df4f893bc20d53063e03834f6/tumblr_n1e93kMh3z1rjbi2lo1_500.gif')
insert into wp_posts 
values ('https://31.media.tumblr.com/79db8c1df4f893bc20d53063e03834f6/tumblr_n1e93kMh3z1rjbi2lo1_500.gif ');

select * from wp_posts 
where post_content LIKE '%31.media.tumblr.com/%' 
  AND post_content NOT LIKE '%.gif';
[...]
1 row in set (0.00 sec)

select * from wp_posts 
where post_content LIKE '%31.media.tumblr.com/%' 
  AND rtrim(post_content) NOT LIKE '%.gif';
[...]
Empty set (0.00 sec)

答案 1 :(得分:0)

您提供的示例网址是一个图片,因此我认为它位于<img>标记之内,如果是这样的话......您需要做的就是添加%通配符.gif的结尾。这就是为什么脚本可能不起作用的原因。

试试这个

UPDATE wp_posts SET post_content = REPLACE(post_content,'31.media.tumblr.com/','41.media.tumblr.com/')
WHERE post_content LIKE '%31.media.tumblr.com/%' 
AND post_content NOT LIKE '%.gif%';