mysql - 如何创建一个循环来替换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 行,我如何为每个行循环并尝试替换值?
感谢您的帮助,抱歉,如果我无法正确解释自己
解决方案
介绍
您可以使用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_fr
。TABLE1.value
对于这些匹配,将根据 中指定的映射进行替换TABLE2
。
边缘案例
如果有一个name_fr
值包含另一个值,那么最好先评估前者,因为如果先评估后者可能会过早替换。为此,您可以按长度TABLE2
降序排列fr_name
,别名是某个名称。
推荐阅读
- unity3d - 移动相机,使所有物体都在相机的视野中
- r - 在 R 中的数据框中添加列但复制所有其他行值
- android - 如何在通知点击时打开活动
- excel - Excel 文本框不显示一半的文本
- vue.js - 使用 :v-for 遍历数组时遇到问题
- python - 为什么我的功能不影响 tkinter 中的按钮?
- python - 如何在 Visual Studio Code 中的 Windows 机器上安装 PIP
- android - Lint 检查“RemoveWorkManagerInitializer”失败,如何解决?
- css - readall 未在 julia lang 中定义
- c++ - 全屏和放大 Koolplot