【问题标题】:multiply replace in mysql update query with join table将mysql更新查询中的替换与连接表相乘
【发布时间】:2014-10-20 17:44:08
【问题描述】:

我有一些桌子:

#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>')
    )

结果我在 cmets 表中有这些数据

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

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

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

【问题讨论】:

    标签: mysql join left-join


    【解决方案1】:

    评论有点太长了。

    简单的答案是你不能用一个 MySQL update 语句做你想做的事。您的情况是,#words 表中有多个行与#comments 表中的给定行匹配。 documentation 中解释了会发生什么:

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

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

    这让您有两个选择。首先是编写一个存储过程并在循环中执行update。第二个是修复您的数据结构,这样您就不会将事物列表存储在字符串中。

    【讨论】:

      猜你喜欢
      • 2011-12-24
      • 2012-11-10
      • 2011-02-11
      • 2013-02-12
      • 2015-12-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多