Mysql 如何使用另一个表中的匹配值替换/更新列中每个字符串的所有实例?
用逗号分隔的字符串存储数据不是我的事,我也不能在数据库中更改它,所以请耐心等待。我已经在网上和stackoverflow上做了很多搜索,但是如果可以使用MySQL的话,我找不到解决这个问题的方法 我试图用表2中的匹配值替换表1中每个唯一字符串的所有实例。我尝试过通配符、替换、更新、加入等,但我不知道如何让它工作。我知道一个解决方案是为每个字符串替换(),但表2有200多行,这意味着嵌套超过200次 以下是我想要实现的目标。我有两张桌子,表1:Mysql 如何使用另一个表中的匹配值替换/更新列中每个字符串的所有实例?,mysql,sql,Mysql,Sql,用逗号分隔的字符串存储数据不是我的事,我也不能在数据库中更改它,所以请耐心等待。我已经在网上和stackoverflow上做了很多搜索,但是如果可以使用MySQL的话,我找不到解决这个问题的方法 我试图用表2中的匹配值替换表1中每个唯一字符串的所有实例。我尝试过通配符、替换、更新、加入等,但我不知道如何让它工作。我知道一个解决方案是为每个字符串替换(),但表2有200多行,这意味着嵌套超过200次 以下是我想要实现的目标。我有两张桌子,表1: +------+-------------+ | I
+------+-------------+
| Item | Code |
+------+-------------+
| 1 | 614 |
+------+-------------+
| 2 | 212,614,415 |
+------+-------------+
| 3 | 212,303 |
+------+-------------+
| ... | ... |
+------+-------------+
表2:
+------+-------------------+
| Code | Name |
+------+-------------------+
| 614 | Columbus, OH |
+------+-------------------+
| 212 | New York, NY |
+------+-------------------+
| 415 | San Francisco, CA |
+------+-------------------+
| 303 | Ft. Worth, TX |
+------+-------------------+
| ... | ... |
+------+-------------------+
我想用表2中的相应值替换表1中的代码,以产生以下结果:
+------+---------------------------------------------+
| Item | Code |
+------+---------------------------------------------+
| 1 | Columbus, OH |
+------+---------------------------------------------+
| 2 | New York, NY,Columbus, OH,San Francisco, CA |
+------+---------------------------------------------+
| 3 | New York, NY,Ft. Worth, TX |
+------+---------------------------------------------+
| ... | ... |
+------+---------------------------------------------+
这里我们看到了一个完美的例子,说明了为什么在DB字段中使用逗号分隔的列表是个坏主意。它们比适当的关系表更难操作 考虑到这一点,我会考虑首先将代码分成多个记录,然后进行简单的基于集合的替换,然后将它们放回一起。基本上:
select
t1.item,
group_concat(t2.name)
from
table1 t1 join table2 t2 on (
t1.code = t2.code
or t1.code like concat(t2.code, ',%')
or t1.code like concat('%,', t2.code, ',%')
or t1.code like concat('%,', t2.code)
)
group by t1.item
order by t1.item
+ --------- + -------------------------- +
| item | group_concat(t2.name) |
+ --------- + -------------------------- +
| 1 | Columbus, OH |
| 2 | Columbus, OH,New York, NY,San Francisco, CA |
| 3 | Ft. Worth, TX,New York, NY |
+ --------- + -------------------------- +
3 rows
你试过了吗?您可以使用cursorIt轻松地更新每个单元格。我花了很多额外的研究来找出分割函数/存储过程/游标部分,但这就是我有效地完成工作的方式。谢谢我试过你的方法,也试过其他方法。我两个都去工作了,但我无法表达这种方式有多简单。节省了大量的时间。谢谢美好的我认为concat(“%,”,t2.code,“%”)应该是concat(“%,”,t2.code,“,%”),对吗?这是在后面的%前面加一个逗号。@Karl Kieninger。。。你说得对,先生。按照最初的编写方式,您会得到错误的点击(例如,如果您正在查找id=12且有100122,您将在不应该的地方获得该记录)。我将编辑答案以反映您的更正。
select
t1.item,
group_concat(t2.name)
from
table1 t1 join table2 t2 on (
t1.code = t2.code
or t1.code like concat(t2.code, ',%')
or t1.code like concat('%,', t2.code, ',%')
or t1.code like concat('%,', t2.code)
)
group by t1.item
order by t1.item
+ --------- + -------------------------- +
| item | group_concat(t2.name) |
+ --------- + -------------------------- +
| 1 | Columbus, OH |
| 2 | Columbus, OH,New York, NY,San Francisco, CA |
| 3 | Ft. Worth, TX,New York, NY |
+ --------- + -------------------------- +
3 rows