В моей таблице было поле «теги»:
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, ваша привязка к проблеме в любом случае