Mysql удаляет конкретное слово в строке, разделенной запятыми

В моей таблице было поле «теги»:

Теги

tag1, tag2, tag3

Как удалить ', tag2', включая запятую, используя запрос mysql.

Для типа данных SET вы можете использовать что-то вроде этого –

CREATE TABLE sets(tags SET('tag1','tag2','tag3')); INSERT INTO sets VALUES ('tag1,tag2'), ('tag1,tag3,tag2'), ('tag2,tag3'), ('tag3,tag1'); UPDATE sets SET tags = tags &~ (1 << FIND_IN_SET('tag2', tags) - 1); SELECT * FROM sets; +-----------+ | tags | +-----------+ | tag1 | | tag1,tag3 | | tag3 | | tag1,tag3 | +-----------+ 

Помимо первого ответа, который я не тестировал, и поэтому я не имею никакого мнения, другие потерпели неудачу в следующих случаях:

 1- tags = "tag1,tag2,tag22,tag3" 2- tags = "tag2,tag1,tag3" 

в первом примере функция REPLACE (теги, 'tag2', '') удалит третье разделенное запятой значение, то есть tag22, а во втором примере tag2 не будет заменен REPLACE (теги, ', tag2', '')

одним из возможных решений может быть:

 REPLACE(REPLACE(CONCAT(',', tags, ','), 'tag2', ''), ',,', ',') 

проблема с моим решением заключается в том, что вы всегда будете иметь хранилища значений с резервными запятыми как в начале, так и в конце строки. но в моем случае это работает хорошо.

Я думаю, что лучший ответ на эту проблему – на ссылку ниже . Лучший способ удалить значение из поля SET?

запрос должен быть таким, который охватывает значение, значение или значение или только значение в столбце, разделенном запятой

 UPDATE yourtable
 ЗАДАВАТЬ
   Категории =
     TRIM (BOTH ',' FROM
       REPLACE (
         REPLACE (CONCAT (',', REPLACE (col, ',', ',,'), ','), ', 2,', ''), ',,', ',')
     )
 ГДЕ
   FIND_IN_SET ('2', категории)

Здесь вы можете указать свое условие в разделе where. для получения дополнительной информации см. ссылку выше.

Используйте функцию замены в MySQL:

 replace(FIELD_NAME, 'find this string', 'replacement string'); 

поэтому в вашем случае:

 SELECT REPLACE('tag1,tag2,tag3', ',tag2', ''); 

Для более подробной информации смотрите: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace

Я нашел решение, но хотел бы знать, есть ли более простой способ сделать это … SELECT TRIM(BOTH ',' FROM (SELECT REPLACE(REPLACE('tag1,tag2,tag3','tag2',''),',,',',')))

Быстрый совет:

 UPDATE sets SET tags = tags &~ (1 << FIND_IN_SET('tag2', tags) - 1); 

Не работает, когда ваш набор выглядит так: 'tag1', 'tag2', 'tag3'

«tag3» потеряет эту операцию

Я закончил тем, что использовал двойную замену:

 UPDATE sets SET tags = replace(replace(tags, 'tag2', ''), ',,', '') 

Замените замену вместо запятой вместо «tag2», поскольку вы не можете быть уверены, что ваш tagg будет первым или последним элементом набора

в отношении случая tag22, оставляющего 2, делая это, не приводя к нулю в качестве OP, ваша привязка к проблеме в любом случае