Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » MySQL » Как составить sql запрос на замену категории?

Как составить sql запрос на замену категории?


     01.03.2018    sql запрос    Все вопросы » MySQL    1990

вопрос
Добрый день. Подскажите пожалуйста как подправить запрос чтоб корректно выполнялся? Сейчас у меня таким образом:

if ((($category3 == 3) and ($category1 == 1)) or (($category5 == 5) and ($category1 == 1))){
$db->query("UPDATE dle_post SET category = REPLACE(category, '1', '3') WHERE id = '{news-id}'");
}

То есть меняется категория 1 на категорию 3. Но проблема в том если новость принадлежит любой другой категории в которой присутствует 1, запрос ее тоже меняет. Например 11 изменит на 33, 12 изменит на 32. Как указать что нужно менять только целое число 1? Спасибо за помощь.

16 комментариев

MikeTheRaven
Юзер

MikeTheRaven - 1 марта 2018 21:37 -

Можно на php сделать замену через preg_replace и записать результат.
Можно сделать несколько запросов к базе, используя дополнительное условие и оператор LIKE.

ushkom
Юзер

ushkom - 1 марта 2018 22:12 -

Спасибо большое за ответ. Не могли бы пример показать на PHP через preg_replace?

MikeTheRaven
Юзер

MikeTheRaven - 1 марта 2018 22:23 -


$str = preg_replace('#(^|,)1(,|$)#', '${1}3$2', $str);

ushkom
Юзер

ushkom - 1 марта 2018 22:44 -

А через REGEXP_REPLACE не получится сделать замену одним запросом? Спасибо

ushkom
Юзер

ushkom - 1 марта 2018 22:21 -

Еще читал про REGEXP_REPLACE там регуляркой можно указывать, но попытки не обвенчались успехом.

dj-avtosh
PHP-developer

dj-avtosh - 1 марта 2018 23:31 -

Может быть (нужно тестировать)



UPDATE dle_post SET category=TRIM(BOTH ',' from (select replace(CONCAT(',',category,','), ',1,', ',3,'))) WHERE FIND_IN_SET('1',category)>0



По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 1 марта 2018 23:36 -

т.е. мы обязательно оборачиваем список категорий запятыми. Затем, уже будуче уверены, что шаблон един - меняем вместе с запятыми. Далее через trim с модификатором BOTH режем запятые (с начала и конца строки), тем самым приводя в необходимый формат.

Если нужно, можете добавить условие and, из Вашего кода. Иначе заменит вхождение таких категорий у всех новостей одним махом.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ushkom
Юзер

ushkom - 1 марта 2018 23:50 -

Спасибо. Я пробую регуляркой
UPDATE dle_post SET category = REGEXP_REPLACE(category, '#(^|,)1(,|$)#', '${1}3$2') WHERE id = '41'
Не получается. А как сам DLE делает замену категории?

dj-avtosh
PHP-developer

dj-avtosh - 1 марта 2018 23:52 -

ushkom,
я написал Вам готовый рабочий вариант.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ushkom
Юзер

ushkom - 2 марта 2018 00:03 -

Спасибо, а как к новости привязать его, я не совсем понял вот это WHERE FIND_IN_SET('1',category)>0
Сам принцип я понял, запятые чтоб понятно было где начало и конец категории, и сделать замену с запятыми. Как указать {news-id}?

dj-avtosh
PHP-developer

dj-avtosh - 1 марта 2018 23:59 -

ushkom,
DLE, насколько я смотрел в самых ранних версиях, через explode разбирает, пушит, а далее через implode собирает и делает update.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

dj-avtosh
PHP-developer

dj-avtosh - 2 марта 2018 00:02 -

ushkom,
если мне не изменяет память, то REGEXP_REPLACE это не из СУБД mysql. Походу у Вас это кастомная функция.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ushkom
Юзер

ushkom - 2 марта 2018 00:07 -


dj-avtosh
PHP-developer

dj-avtosh - 2 марта 2018 00:06 -

ushkom,
AND id = '{news-id}'

а FIND_IN_SET как раз ищет вхождение определенного значения по вашему COMMA SEPARATOR.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

ushkom
Юзер

ushkom - 2 марта 2018 00:11 -

Большое человеческое спасибо. Работает все отлично, и не зависит от расположение нумерации категории.

dj-avtosh
PHP-developer

dj-avtosh - 2 марта 2018 00:08 -

ushkom,
вот там вроде написано ORACLE.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх