MySQL从列表中删除特定编号

MySQL从列表中删除特定编号,mysql,Mysql,我有一个具有以下结构的数据库: +----+----+-------------------+---------------+ | id | by | name | list | +----+----+-------------------+---------------+ | 1 | 1 | FirstName | 12,6,5,3,2,66 | +----+----+-------------------+-----------

我有一个具有以下结构的数据库:

+----+----+-------------------+---------------+ | id | by | name | list | +----+----+-------------------+---------------+ | 1 | 1 | FirstName | 12,6,5,3,2,66 | +----+----+-------------------+---------------+ | 2 | 1 | SecondName | 6,3,5 | +----+----+-------------------+---------------+
遗憾的是,我将无法使用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;