1

我知道我不能通过 phpMyAdmin 在 MySQL 替换查询中使用通配符。但是,我需要某种解决方法。我对想法非常开放。下面是瘦身:

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

我基本上需要做以下事情:

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

但我知道该'src=\"%\"'组件不会跳动。

所以我在你的集体知识的脚下想出一些方法来获取src="%"并用一个设置的 URL 替换它以获取一个设置的页面 ID 号。提前致谢。

4

2 回答 2

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 提取左边的body 部分src=",最后两个嵌套的SUBSTRING_INDEX 提取第一个"next右边的body 部分src="

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

于 2013-04-09T16:22:19.570 回答
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 值的所有记录。

于 2013-04-09T15:54:05.227 回答