MySQL从列表中删除特定号码

时间:2014-04-28 23:33:20

标签: mysql

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

+----+----+-------------------+---------------+
| id | by | name              | list          |
+----+----+-------------------+---------------+
|  1 |  1 | FirstName         | 12,6,5,3,2,66 |
+----+----+-------------------+---------------+
|  2 |  1 | SecondName        | 6,3,5         |
+----+----+-------------------+---------------+

我需要做的是从list列中删除某个数字,例如“6”数字(table可能包含数千行包含特定列表ID的行需要删除)。

我尝试了以下几乎可以工作的查询,它可以删除'6'条目,但它也会剥离66并且可以留下一个空列表元素(例如:,, 3,2):

UPDATE `table`
SET `list` =
REPLACE (
    `list`,
    '6',
    '' )
WHERE
    find_in_set('6', list);

遗憾的是,我无法使用任何外部库(如preg_replace),也无法重构数据库,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

如果你不能重组并且需要忍受这种憎恶,我认真地建议你不要接受这份工作。

那就是说,你需要区分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_LENGTH("6")+1

答案 1 :(得分:0)

有一种方法可以使用一个更新语句执行此操作。亵渎神明的想法是用空格替换逗号,这样你就可以使用ltrim()rtrim()

update table t
    set list = replace(ltrim(rtrim(replace(concat(' ', replace(list, ',', ' '), ' '), ' 6 ', ' '))), ' ', ',')
    where find_in_set('6', list) > 0;

步骤如下:

  1. 用空格替换列表中的逗号。
  2. 在列表的开头和结尾添加一个空格。
  3. 用空格替换' 6 '。这将删除列表中的任何位置。
  4. 使用ltrim()rtrim()删除字符串开头和结尾的空格。
  5. 用逗号替换空格。