这是更新mysql集合字段的最佳方法,也是从字段中删除特定值的最佳方式。
例如:字段类别的值:1、2、3、4、5?我想从列表中删除“2”:
UPDATE table
SET categories = REPLACE(categories, ',2,', ',')
WHERE field LIKE '%,2,%';
但是如果'2‘是列表中的第一个或最后一个值呢?
UPDATE table
SET categories = REPLACE(categories, '2,', '')
WHERE field LIKE '2,%';
UPDATE table
SET categories = REPLACE(categories, ',2', '')
WHERE field LIKE ',2%';
我怎么能在一个查询中处理所有3种情况?!
发布于 2013-02-01 17:26:18
如果需要从集合中删除的值不能多次出现,则可以使用以下命令:
UPDATE yourtable
SET
categories =
TRIM(BOTH ',' FROM REPLACE(CONCAT(',', categories, ','), ',2,', ','))
WHERE
FIND_IN_SET('2', categories)
看看它是如何工作的,here。如果该值可以多次出现,则会删除该值的所有实例:
UPDATE yourtable
SET
categories =
TRIM(BOTH ',' FROM
REPLACE(
REPLACE(CONCAT(',',REPLACE(col, ',', ',,'), ','),',2,', ''), ',,', ',')
)
WHERE
FIND_IN_SET('2', categories)
发布于 2013-02-01 19:03:55
update TABLE
set COLUMN = COLUMN & ~NUM
where COLUMN & NUM
摘自:http://dev.mysql.com/doc/refman/5.0/en/set.html的评论部分
不过要注意,NUM不是值'2‘,而是它的内部索引。因此,如果您定义了类似"set ('1,'2','3','4','5')“的字段,则这些值的对应索引为(1,2,4,8,16)。
发布于 2016-10-13 17:22:24
这是另一种方法:
UPDATE table
SET categories = CONCAT_WS(',',
IF(FIND_IN_SET('1', categories), '1', NULL),
-- Note that '2' is missing here!
IF(FIND_IN_SET('3', categories), '3', NULL),
IF(FIND_IN_SET('4', categories), '4', NULL),
IF(FIND_IN_SET('5', categories), '5', NULL)
);
CONCAT_WS
将其所有参数(除参数1外)与第一个参数(在本例中为','
)连接在一起,如果它们不是NULL
的话。我们查找SET
字段的每个可能值(如果该字段包含该值),但跳过要删除的值(在本例中为2
)。如果是,则返回该值,否则返回NULL
。这将使用','
连接集合的所有值,跳过我们想要删除的值,并为SET
字段重新构造一个新值。
当然,这只有在您知道categories
的所有可能值的情况下才有效,但由于这是一个SET
字段,所以您知道这一点。
https://stackoverflow.com/questions/14642658
复制相似问题