我的表格中有'tags'字段:
TAG1,TAG2,TAG3
如何使用mysql查询删除包含逗号的',tag2'。
答案 0 :(得分:3)
对于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 :(得分:3)
除了我没有测试的第一个答案,因此我没有意见,其他人在以下情况下会失败:
1- tags = "tag1,tag2,tag22,tag3"
2- tags = "tag2,tag1,tag3"
在第一个例子中,REPLACE(tags,'tag2','')函数将删除第三个逗号分隔值,即tag22,在第二个示例中,tag2将不会被REPLACE(tags,', tag2','')
一种可能的解决方案是:
REPLACE(REPLACE(CONCAT(',', tags, ','), 'tag2', ''), ',,', ',')
我的解决方案的问题在于,您总是会在字符串的开头和结尾处使用带有冗余逗号的值存储。但就我而言,它运作良好。
答案 2 :(得分:3)
我认为此问题的最佳答案在以下链接中 The best way to remove value from SET field?
查询应该是这样的,它涵盖了逗号分隔列
中的值,值或值,或仅包含值UPDATE yourtable SET categories = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', col, ','), ',2,', ',')) WHERE FIND_IN_SET('2', categories)
在这里你可以在where子句中找到你的条件。有关详细信息,请参阅上面的链接。
答案 3 :(得分:0)
在MySQL中使用replace函数:
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
答案 4 :(得分:0)
我找到了一个解决方案,但很想知道是否有更简单的方法... SELECT TRIM(BOTH ',' FROM (SELECT REPLACE(REPLACE('tag1,tag2,tag3','tag2',''),',,',',')))
答案 5 :(得分:0)
快速提示:
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那样没有引导零的情况,无论如何你的麻烦就是