MySQL从列表中删除特定编号
我有一个具有以下结构的数据库: +----+----+-------------------+---------------+ | id | by | name | list | +----+----+-------------------+---------------+ | 1 | 1 | FirstName | 12,6,5,3,2,66 | +----+----+-------------------+---------------+ | 2 | 1 | SecondName | 6,3,5 | +----+----+-------------------+---------------+MySQL从列表中删除特定编号,mysql,Mysql,我有一个具有以下结构的数据库: +----+----+-------------------+---------------+ | id | by | name | list | +----+----+-------------------+---------------+ | 1 | 1 | FirstName | 12,6,5,3,2,66 | +----+----+-------------------+-----------
遗憾的是,我将无法使用MySQL的任何外部库(如preg_replace),也无法重构数据库,有什么方法可以做到这一点吗?如果你无法重构,需要忍受这种讨厌的东西,我郑重建议你不要接受这项工作 也就是说,您需要区分3种情况:
- 6开始时
- 6最后
- 6在中间
UPDATE `table` SET `list`=RIGHT(`list`,CHAR_LENGTH(`list`)-2) WHERE `list` LIKE '6,%';
UPDATE `table` SET `list`=LEFT(`list`,CHAR_LENGTH(`list`)-2) WHERE `list` LIKE '%,6';
UPDATE `table` SET `list`=REPLACE(`list`,',6,','') WHERE `list` LIKE '%,6,%';
注意常量
2
-它只对一个数字有效。为了使这种通用性CHAR\u LENGTH(“6”)+1
有一种方法可以通过一条update语句来实现。亵渎神明的想法是将逗号替换为空格,因此可以使用ltrim()
和rtrim()
:
这些步骤是:
'6'
替换为空格。这将删除列表中任何位置的元素ltrim()
和rtrim()
删除字符串开头和结尾的空格@菲尔:你读了整篇文章了吗?我清楚地说我不能重组数据库。是的,我做了,我问过你为什么不能这样做,但为什么还要麻烦数据库?@草莓,因为这就是我被要求做的。但你没有利用关系数据库真正擅长的一件事:-(
UPDATE `table` SET `list`=RIGHT(`list`,CHAR_LENGTH(`list`)-2) WHERE `list` LIKE '6,%';
UPDATE `table` SET `list`=LEFT(`list`,CHAR_LENGTH(`list`)-2) WHERE `list` LIKE '%,6';
UPDATE `table` SET `list`=REPLACE(`list`,',6,','') WHERE `list` LIKE '%,6,%';
update table t
set list = replace(ltrim(rtrim(replace(concat(' ', replace(list, ',', ' '), ' '), ' 6 ', ' '))), ' ', ',')
where find_in_set('6', list) > 0;