luc*_*umt 5 mysql sql mysql-5.0
我参与了一个项目并遇到了别人的糟糕设计,我们有一个叫做task的表,每个任务都有很多用户,任务表如下:
+----------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------------+------+-----+---------+-------+
| id | varchar(40) | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| task_users | varchar(1000) | YES | | NULL | |
Run Code Online (Sandbox Code Playgroud)
并且用户存储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
Run Code Online (Sandbox Code Playgroud)
删除用户ID时,更新的结果就像
aaa,bbb
Run Code Online (Sandbox Code Playgroud)
我想知道我们可以使用一个更新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, '[[:>:]]');
Run Code Online (Sandbox Code Playgroud)
这是演示的链接(仅用于测试目的):
这个答案使用了一个技巧,即我们将逗号附加到字符串的开头和结尾task_users。然后,我们通过在其开头和结尾附加逗号来比较给定的用户 ID。如果找到匹配项,我们将仅替换为一个逗号。但是,这使得替换仍然带有起始逗号和结束逗号,因此我们使用子字符串操作删除它们。
撇开 SQL Olympics 不谈,希望您可以通过这些答案的复杂性看到,在 SQL 数据库中处理 CSV 数据可能是一个真正令人头痛的问题。也许您甚至可以使用此页面作为向同事证明表格设计需要更改的证据。
| 归档时间: |
|
| 查看次数: |
887 次 |
| 最近记录: |