Форум об интернет-маркетинге
Вернуться   Форум об интернет-маркетинге > Технические вопросы > Веб-строительство

Ответ
 
Опции темы
Старый 20.12.2020, 04:48   #1
sanek1991
Senior Member
Профессор
 
Регистрация: 21.06.2020
Сообщений: 859
Сказал(а) спасибо: 80
Получил(а) "Спасибо": 187
Нарушения: 0/0 (0)
Репутация: 74780

Thread Starter MySQL replace

Можно ли SQL запросом удалить все что находится внутри квадратных скобок?

То есть, есть в таблице есть типа таких записей:
[aaa bbb cc]ddd eee[/aaa]
[aaa xxx xxx]ddd eee[/aaa]

Нужно получить:
ddd eee
sanek1991 вне форума   Ответить с цитированием
Старый 20.12.2020, 12:44   #2
XPraptor
Думаю, что надо худеть
Академик
 
Аватар для XPraptor
 
Регистрация: 22.06.2020
Сообщений: 1,791
Сказал(а) спасибо: 1,526
Получил(а) "Спасибо": 1,939
Нарушения: 0/0 (0)
Репутация: 608321

По умолчанию Re: MySQL replace

Да можно, у mysql есть функции регулярных выражений.
Сейчас гляну чтобы вспомнить и напишу (но без проверки на реальной бд напишу).
По идее, вот так будет:
Код:
UPDATE table_name SET field_name= REPLACE(field_name, REGEXP '\\[.*?\\]', '')
На счет двойных слэшей зависит от реализации версии БД, чуть-что, нужно пробовать с одиночными: \[.*?\]
Состояние бота google и полезные ресурсы: всё про гугл

Последний раз редактировалось XPraptor; 20.12.2020 в 13:04.
XPraptor вне форума   Ответить с цитированием
Сказали спасибо:
Старый 20.12.2020, 13:03   #3
sanek1991
Senior Member
Профессор
 
Регистрация: 21.06.2020
Сообщений: 859
Сказал(а) спасибо: 80
Получил(а) "Спасибо": 187
Нарушения: 0/0 (0)
Репутация: 74780

Thread Starter Re: MySQL replace

Спасибо, попробую потестить
sanek1991 вне форума   Ответить с цитированием
Старый 20.12.2020, 15:25   #4
sanek1991
Senior Member
Профессор
 
Регистрация: 21.06.2020
Сообщений: 859
Сказал(а) спасибо: 80
Получил(а) "Спасибо": 187
Нарушения: 0/0 (0)
Репутация: 74780

Thread Starter Re: MySQL replace

Что-то пошло не так с синтаксисом.
Получаю такую ошибку:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near
sanek1991 вне форума   Ответить с цитированием
Старый 20.12.2020, 15:49   #5
Sitealert
Слесарь-сайтосборщик
Доцент
 
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645

По умолчанию Re: MySQL replace

Цитата:
Сообщение от sanek1991 Посмотреть сообщение
Что-то пошло не так с синтаксисом.
Код:
UPDATE table_name SET field_name=REGEXP_REPLACE(field_name, '\\[.*?\\]', '')
Sitealert вне форума   Ответить с цитированием
Сказали спасибо:
Старый 20.12.2020, 16:00   #6
sanek1991
Senior Member
Профессор
 
Регистрация: 21.06.2020
Сообщений: 859
Сказал(а) спасибо: 80
Получил(а) "Спасибо": 187
Нарушения: 0/0 (0)
Репутация: 74780

Thread Starter Re: MySQL replace

Такая конструкция заработала,
UPDATE table_name SET field_name=REGEXP_REPLACE(field_name, '\\[.*?\\]', '')

Но, если на всю таблицу, то напрочь виснет БД.
Если на отдельную запись, всё OK.
Похоже что очень ресурсо-требовательная команда для всей базы.
В базе более 1 млн записей.

Сейчас думаю, может есть какой-то php-скрипт, что-бы он с паузами, перебирал все записи из таблицы и делал перезапись?
sanek1991 вне форума   Ответить с цитированием
Старый 20.12.2020, 16:10   #7
Sitealert
Слесарь-сайтосборщик
Доцент
 
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645

По умолчанию Re: MySQL replace

Цитата:
Сообщение от sanek1991 Посмотреть сообщение
Сейчас думаю, может есть какой-то php-скрипт, что-бы он с паузами, перебирал все записи из таблицы и делал перезапись?
Скрипт будет, если его напишешь. Но для разовой правки быстрее будет просто несколько раз выполнить запрос через пхпмайадмин, разбив его на диапазоны, как-то так:
Код:
UPDATE table_name SET field_name=REGEXP_REPLACE(field_name, '\\[.*?\\]', '') WHERE id>0 AND id<100000
Код:
UPDATE table_name SET field_name=REGEXP_REPLACE(field_name, '\\[.*?\\]', '') WHERE id>99999 AND id<200000
И т.д.
Sitealert вне форума   Ответить с цитированием
Старый 20.12.2020, 16:15   #8
sanek1991
Senior Member
Профессор
 
Регистрация: 21.06.2020
Сообщений: 859
Сказал(а) спасибо: 80
Получил(а) "Спасибо": 187
Нарушения: 0/0 (0)
Репутация: 74780

Thread Starter Re: MySQL replace

Цитата:
Сообщение от Sitealert Посмотреть сообщение
Скрипт будет, если его напишешь. Но для разовой правки быстрее будет просто несколько раз выполнить запрос через пхпмайадмин, разбив его на диапазоны, как-то так:
Код:
UPDATE table_name SET field_name=REGEXP_REPLACE(field_name, '\\[.*?\\]', '') WHERE id>0 AND id<100000
Была такая идея, но даже для одной строки время выполнения 7 сек.
Как-то не реально дробить на большое количество раз.
Вот скрипт запустить на ночь, было-бы интереснее.

Только в условие я добавлял BETWEEN
WHERE `content_id` BETWEEN 6094934 AND 6094934
Не может же из-за этого стока долго?
sanek1991 вне форума   Ответить с цитированием
Старый 20.12.2020, 16:20   #9
Sitealert
Слесарь-сайтосборщик
Доцент
 
Регистрация: 22.06.2020
Адрес: Замкадье
Сообщений: 403
Сказал(а) спасибо: 985
Получил(а) "Спасибо": 1,178
Нарушения: 0/0 (0)
Репутация: 180645

По умолчанию Re: MySQL replace

Цитата:
Сообщение от sanek1991 Посмотреть сообщение
Была такая идея, но даже для одной строки время выполнения 7 сек.
В каком смысле для одной строки? Для одной записи? Не должно быть такого. Для одной записи должны быть доли секунды.
То есть в смысле для одной строки таблицы.
Sitealert вне форума   Ответить с цитированием
Старый 20.12.2020, 16:28   #10
sanek1991
Senior Member
Профессор
 
Регистрация: 21.06.2020
Сообщений: 859
Сказал(а) спасибо: 80
Получил(а) "Спасибо": 187
Нарушения: 0/0 (0)
Репутация: 74780

Thread Starter Re: MySQL replace

Цитата:
Сообщение от Sitealert Посмотреть сообщение
В каком смысле для одной строки? Для одной записи? .
Да, для одной записи.
Обычный REPLACE - доли секунды, а этот 7 сек.
Тестирую пока с копией базы, на локальном сервере, но сервер мощный.
На рабочей базе, собственно тоже такое время для одной записи.
На всю рабочую базу не рискнул.
sanek1991 вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка - MySQL query error [1615]: Prepared statement needs to be re-prepared sanek1991 Хостинг и домены 19 29.07.2020 19:24
Помогите с SQL запросом replace sanek1991 Веб-строительство 34 16.07.2020 13:26
Переход с php5 на php7, если много mysql запросов ziliboba0213 Веб-строительство 31 14.07.2020 18:44


Текущее время: 16:02. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc. Перевод: zCarot