我参与了一个项目,遇到了别人设计的不好,我们有一个task表,每个task有很多用户,task表如下:
+----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| id | varchar(40) | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| task_users | varchar(1000) | YES | | NULL | |
并且用户像aaa,bbb,ccc
一样存储在task_users
列中,这意味着许多用户id被放在一个列中,我知道这是一个非常糟糕的设计但由于这是一个旧项目,我无法修改表格设计。
现在我有一个问题,如果用户被删除了,我如何从task_users
列中删除它?
用户id由UUID生成,固定长度32个字符,所以每个用户id都是唯一的,比如40cf5f01eb2f4d2c954412f27b3bf6eb
,但问题是用户id可能出现在任意位置task_users
列的,所以我不知道如何删除它
aaa,40cf5f01eb2f4d2c954412f27b3bf6eb,bbb -- in center
40cf5f01eb2f4d2c954412f27b3bf6eb,aaa,bbb -- in head
aaa,bbb,40cf5f01eb2f4d2c954412f27b3bf6eb -- in end
删除用户id后,更新后的结果是这样的
aaa,bbb
我想知道我们是否可以使用一个更新sql来删除指定的用户id并仍然保持相同的数据格式?
注意:我是在MySQL存储过程中做的,附加变量可能会有帮助,但我还是想只用一个sql来做,MySQL版本是5.0
提前致谢!
最佳答案
我想我们可以用一个查询来做到这一点:
UPDATE yourTable
SET task_users = SUBSTRING(
REPLACE(CONCAT(',', task_users, ','), CONCAT(',', uid, ','), ','),
2,
LENGTH(task_users) - LENGTH(uid) - 1)
WHERE task_users REGEXP CONCAT('[[:<:]]', uid, '[[:>:]]');
这是一个演示链接(仅用于测试目的):
Demo
这个答案使用了一个技巧,我们将逗号附加到 task_users
字符串的开头和结尾。然后,我们通过在其开头和结尾附加逗号来比较给定的用户 ID。如果找到匹配项,我们只用一个逗号替换。但是,这会使替换仍然保留其开始和结束逗号,因此我们使用子字符串操作删除它们。
抛开 SQL Olympics,希望您能从这些答案的复杂性中看出,在 SQL 数据库中处理 CSV 数据确实令人头疼。也许您甚至可以使用此页面向您的同事证明表格设计需要更改。
关于mysql - 如何用MySQL删除列中的特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54121902/