SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.09.2015 17:10:58

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

FIND_IN_SET & REPLACE_IN_SET

Приветствую комрады!

Возникла такая задача, есть поле, допустим list,  в котором хранится список значений через запятую, например такой "1,2,22,e,121"

Если мне нужно найти строку таблицы в которой в этом списке есть нужное значение то всё просто:

SELECT
...
WHERE
FIND_IN_SET('1',`list`)

А как сделать изящно update значения в таком списке?
Просто написать
REPLACE(list,'1','2')
WHERE
FIND_IN_SET('1',`list`)

Нельзя, т.к. поменяются все единицы, а не только первый элемент в списке
Можно наверно написать что то монструозное через if-ы проверяя первое значение, последние значение + replace(list,',1,',',2,')
Можно в поле добавить запятые по краям списков всем записям и тогда можно просто делать replace(list,',1,',',2,'), но поле хотелось бы не трогать.


Есть еще какие то, более симпатичные варианты?

Неактивен

 

#2 25.09.2015 17:25:28

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: FIND_IN_SET & REPLACE_IN_SET

Вы все правильно описали. Кажется, что сработает вариант добавить запятые по краям, потом их удалить:

TRIM(BOTH ',' FROM replace(concat(',',list,','),',1,',',2,'))

Неактивен

 

#3 25.09.2015 17:32:46

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: FIND_IN_SET & REPLACE_IN_SET

rgbeast написал:

Вы все правильно описали. Кажется, что сработает вариант добавить запятые по краям, потом их удалить:

TRIM(BOTH ',' FROM replace(concat(',',list,','),',1,',',2,'))

Супер! Идея на лету добавить/удалить запятые отличная! Спасибо

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson