Mysql 如何使用另一个表中的匹配值替换/更新列中每个字符串的所有实例?

Mysql 如何使用另一个表中的匹配值替换/更新列中每个字符串的所有实例?,mysql,sql,Mysql,Sql,用逗号分隔的字符串存储数据不是我的事,我也不能在数据库中更改它,所以请耐心等待。我已经在网上和stackoverflow上做了很多搜索,但是如果可以使用MySQL的话,我找不到解决这个问题的方法 我试图用表2中的匹配值替换表1中每个唯一字符串的所有实例。我尝试过通配符、替换、更新、加入等,但我不知道如何让它工作。我知道一个解决方案是为每个字符串替换(),但表2有200多行,这意味着嵌套超过200次 以下是我想要实现的目标。我有两张桌子,表1: +------+-------------+ | I

用逗号分隔的字符串存储数据不是我的事,我也不能在数据库中更改它,所以请耐心等待。我已经在网上和stackoverflow上做了很多搜索,但是如果可以使用MySQL的话,我找不到解决这个问题的方法

我试图用表2中的匹配值替换表1中每个唯一字符串的所有实例。我尝试过通配符、替换、更新、加入等,但我不知道如何让它工作。我知道一个解决方案是为每个字符串替换(),但表2有200多行,这意味着嵌套超过200次

以下是我想要实现的目标。我有两张桌子,表1:

+------+-------------+
| 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字段中使用逗号分隔的列表是个坏主意。它们比适当的关系表更难操作

考虑到这一点,我会考虑首先将代码分成多个记录,然后进行简单的基于集合的替换,然后将它们放回一起。基本上:

  • 使用创建一个临时表tmp1,每个项目/代码对有一条记录

  • 然后对tmp1.code进行更新,该代码来自加入表1的tmp1

  • 最后使用将名称重新组合在一起

  • 这应该可以做到(参见下面的最后一个查询)。我已经在连接中包含了逗号,因此像12这样的和id与您的和id 212不匹配(例如)

    编辑: 或者,如果您希望像这样保持数据非规范化:

    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