2013-04-09 2 views
1

Я знаю, что я не могу использовать подстановочный знак в MySQL-замене запроса через phpMyAdmin. Но мне нужно какое-то обходное решение. Я очень открыт для идей. Вот тощий:Работа над SQL Заменить подстановочные знаки

У меня около 2000 страниц в базе данных MySQL, для которых необходимо обновить URL-адрес изображения. Некоторые из них локальные, некоторые из них hotlinked. Каждый из них отличается, длина URL-адресов меняется, изображение на странице и новое изображение являются уникальными для каждого идентификатора страницы, и каждый из них встречается в другом месте на странице.

мне в принципе нужно сделать следующее:

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

Но я знаю, что 'src=\"%\"' компонент не джайв.

Таким образом, я подхожу к ногам ваших коллективных знаний, чтобы каким-то образом принять src="%" и заменить его заданным URL-адресом для заданного идентификационного номера страницы. Заранее спасибо.

+0

У вас есть таблица, которая связывает старые и новые значения 'src' с идентификатором страницы? –

+0

Да и нет. У меня есть лист Excel с новым URL-адресом изображения и идентификационным номером страницы. Например, «image5.jpg» соответствует идентификатору страницы 123. Новые все находятся в одном каталоге, поэтому в итоге это будет «mysite/images/image5.jpg», сопоставленное с идентификатором страницы 123. У меня нет однако список старых. –

+0

Как вы предлагаете заменить старые, если вы не знаете, какие значения? Нужно ли заменять только одно изображение на одну страницу или некоторые новые изображения должны заменять некоторые старые? –

ответ

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 не останавливается во второй двойной кавычки? –

+0

@ShannonHollingsworth обновил мой ответ, см. Здесь http://sqlfiddle.com/#!2/e99b5/1 ... это выглядит не очень хорошо, но должно быть хорошо – fthiella

+0

Это сработало! :) Я могу использовать Excel для конкатенации изображений и идентификаторов страниц с этим кодом между ними. Спасибо!! :) –

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

Спасибо! Проблема в том, что я не знаю, что происходит в столбце «Найти». У меня нет списка URL-адресов, которые уже существуют на страницах. У меня есть список новых. :/ –

+0

Есть ли только один URL на страницу для замены? –

+0

В большинстве случаев да. Возможно, есть 50 страниц с несколькими изображениями. –

Смежные вопросы