2013-04-09 47 views
1

我知道我不能在通过phpMyAdmin的MySQL替换查询中使用通配符。但是,我需要某种解决方法。我对创意非常开放。这里的瘦:解决SQL替换通配符

我有约2,000页的MySQL数据库,需要有图像URL的更新。有些是本地的,有些是热链接的。每一个都是不同的,网址长度不一样,页面上的图像和新图像每个页面的ID号都是唯一的,每一个都出现在页面的不同位置。

基本上,我需要做到以下几点:

UPDATE pages SET body = replace(body, 'src=\"%\"', 'src=\"http://newdomain/newimage.jpg\"') WHERE id="{page_number}" 

但我知道'src=\"%\"'组件不合拍。

因此,我在你的集体知识的基础上想出一些方法来采取src="%"并用设置的页面ID号的设置URL替换它。提前致谢。

+0

你有任何一种将旧的和新的'src'值关联到页面ID的表? – 2013-04-09 15:49:29

+0

是的,没有。我有一个Excel表格,其中包含新的图片网址和页面ID号。例如,“image5.jpg”与页面ID 123相匹配。新的都在同一目录中,因此最终会成为与页面ID 123相匹配的“mysite/images/image5.jpg”。我没有尽管如此,还是旧的列表。 – 2013-04-09 15:50:58

+0

如果你不知道这些值是什么,你如何建议替换旧的?每页只有一张图像被替换,或者某些新图像需要替换某些旧图像? – 2013-04-09 15:58:21

回答

1

如果有每页只有一个形象,一个快速的解决办法是这样的:

UPDATE pages 
SET 
    body = CONCAT(
    SUBSTRING_INDEX(body, 'src="', 1), 
    'src=\"http://newdomain/newimage.jpg\"', 
    SUBSTRING(
     SUBSTRING_INDEX(body, 'src="', -1) 
     FROM LOCATE('"', SUBSTRING_INDEX(body, 'src="', -1))+1) 
    ) 
WHERE 
    id="{page_number}" AND 
    body NOT LIKE '%<img%<img%'; 

首先SUBSTRING_INDEX在src="左侧提取主体部分,最后两个嵌套SUBSTRING_INDEX提取的主体部分右边第一个"旁边src="

最后一次检查是一个非常脏的检查,以确保字符串中只存在一个图像。在某些情况下它可能会失败,但它可能会有所帮助。

+0

这已经过了,但删除了映像后面的所有内容,并留下了空白页。也许第一个SUBSTRING_INDEX没有停在第二个双引号? – 2013-04-09 16:35:39

+0

@ShannonHollingsworth更新了我的答案,请在这里看到http://sqlfiddle.com/#!2/e99b5/1 ...它看起来不太好看,但它应该没问题 – fthiella 2013-04-09 16:51:26

+0

工作正常! :)我可以使用Excel连接图像和页面标识符与此代码之间。谢谢!! :) – 2013-04-09 16:56:54

0

我的建议是建立一个表,你替换字符串应该是这样的:

page_id  replace 
1   src="..." 

然后你就可以在一个更新JOIN这样

UPDATE pages AS p 
INNER JOIN replace AS r 
    ON p.page_id = r.page_id 
SET p.body = REPLACE(p.body, CONCAT('src="', SUBSTRING_INDEX(SUBSTRING_INDEX(p.body, 'src="', -1), '"', 1), '"', r.replace); 

这将取代过去的发生格式为src="..."的任何内容都具有相同格式的新值,因此对于具有单个src值的所有记录都适用。

+0

谢谢!问题是我不知道在'find'列中发生了什么。我没有网页上已有的网址列表。我只是有一个新的列表。 :/ – 2013-04-09 15:57:52

+0

每个页面只有一个URL需要替换吗? – 2013-04-09 16:01:58

+0

在大多数情况下,是的。有50个页面可能包含多个图像。 – 2013-04-09 16:03:25