用连接表在mysql更新查询中多次替换

时间:2014-10-20 17:44:08

标签: mysql join left-join

我有一些表格:

#comments
| id| text     |
----------------
| 1 | aa bb cc |

#words
| id| word |
------------
| 1 | aa   |
| 2 | bb   |

然后我运行此查询

UPDATE comments AS c
        LEFT JOIN
    words AS w ON (c.text LIKE CONCAT('%', w.word, '%')) 
SET 
    c.text = REPLACE(
        c.text,
        w.word,
        CONCAT('<b>', w.word, '</b>')
    )

结果我在评论表中有这些数据

| id| text            |
-----------------------
| 1 | <b>aa</b> bb cc |

如何更改我的查询以获得结果?

| id| text                   |
------------------------------
| 1 | <b>aa</b> <b>bb</b> cc |

1 个答案:

答案 0 :(得分:0)

评论时间太长了。

简单的答案是,您无法使用单个MySQL update语句执行所需操作。您可能在#words表中有多行与#comments表中的给定行匹配。 documentation

中解释了会发生什么
  

对于多表语法,UPDATE更新每个名为的表中的行   在table_references中满足条件。 每个匹配的行都是   更新一次,即使它多次匹配条件。

这可以在一些使用递归CTE的数据库中完成。并且,如果您具有正则表达式替换功能,则可能。但是,这些都不是MySQL中的选项。

这给你留下了两个选择。第一种是编写存储过程并在循环中执行update。第二个是修复数据结构,这样就不会在字符串中存储事物列表。