首页 > 解决方案 > 如何创建一个循环来替换mysql中的值

问题描述

我有两张这样的表:

Table 1:
+---------------------+
| name_fr |  name_en  |
+---------------------+
| valfr1  |  valen1   |
+---------------------+


Table 2:
+------------------------+
| id |      value        |
+------------------------+
| 1  |  valfr1 is thiss  |
+------------------------+
| 2  | something random  |
+------------------------+

我尝试循环表 1 的每一行并获取每个字段的值,然后对于表 2 中的每一行,我打算在值字段中进行替换。给定表格示例,循环将执行以下操作:

update table2 set value = replace(value, 'valfr1', 'valen1');

它将用 id 1 替换 table2 中的值,它将具有 'valen1 is thiss'

但是想象一下 table1 有例如 100 行,我如何为每个行循环并尝试替换值?

感谢您的帮助,抱歉,如果我无法正确解释自己

标签: mysql

解决方案


介绍

您可以使用update命令轻松实现类似的功能。不用担心,这最终会在引擎盖下进行循环,它只是一个已经优化了数十年的循环,因此您的循环很可能不会表现得那么好。至少不是没有很大的努力。因此,对于这个答案,我将假设 anupdate足以达到此目的。

参考:https ://www.mysqltutorial.org/mysql-update-join/

查询

UPDATE TABLE1
JOIN TABLE2
ON TABLE1.value LIKE CONCAT('%', TABLE2.name_fr, '%')
SET TABLE1.value = REPLACE(TABLE1.value, TABLE2.name_fr, TABLE2.name_en);

解释

此查询将所有记录从 匹配TABLE1到它们的对应项TABLE2,其中TABLE1.value包含TABLE2.name_frTABLE1.value对于这些匹配,将根据 中指定的映射进行替换TABLE2

边缘案例

如果有一个name_fr值包含另一个值,那么最好先评估前者,因为如果先评估后者可能会过早替换。为此,您可以按长度TABLE2降序排列fr_name,别名是某个名称。


推荐阅读