mysql - mysql 是否可以动态翻译存储在字符串中的 ID?

标签 mysql replace

我正在将 mysql 中的评论数据从一个数据库导入到另一个数据库,其中某些数据可能已经存在。与此相关的是,我们的 comments 表有一个 text 类型的 display_text 列。在本列中,我们提到了以“@{{"user":id}}@”格式存储的其他用户,其中 id 是表示另一个表中用户 ID 的数字。一条评论可能有多个提及,也需要更新 ID。

由于这些用户可能已存在于新数据库中,因此我们导入过程的一部分会使用 old_idnew_id 列映射填充 id_translations 表将源数据库中的用户 ID 更改为新数据库中的用户 ID。是否可以编写一条 mysql UPDATE 语句来查找我们提及的格式,并仅用新 id 替换 id ?

我已经有一种方法可以只选择需要更新 id 的评论,因此可以像更新整个表一样编写语句。

MySQL 版本 5.6。这是我的表格的示例。

CREATE TABLE IF NOT EXISTS `comments` (
  `id` int(6) unsigned NOT NULL,
  `display_text` text NOT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `id_translations` (
  `old_id` int(6) unsigned NOT NULL,
  `new_id` int(6) unsigned NOT NULL,
  PRIMARY KEY (`old_id`, `new_id`)
);

INSERT INTO `comments` (`id`, `display_text`) VALUES
(1, 'Hey @{{"user":12}}@, look at this'),
(2, 'Thats pretty cool'),
(3, '@{{"user":41}}@ could you take a peek at this?');

INSERT INTO `id_translations` (old_id, new_id) VALUES (12, 100), (41, 101);

我们的目标是让评论看起来像这样:

1, 'Hey @{{"user":100}}@, look at this'
2, 'Thats pretty cool'
3, '@{{"user":101}}@ could you take a peek at this?'

最佳答案

CREATE PROCEDURE replacing ()
BEGIN
    REPEAT
        UPDATE comments
        SET display_text = CONCAT( LEFT(display_text, LOCATE('@{{"user":', display_text) - 1),
                                   CHAR(0),
                                   ( SELECT new_id 
                                     FROM id_translations 
                                     WHERE old_id = 0 + SUBSTRING(display_text FROM LOCATE('@{{"user":', display_text) + 10)),
                                   CHAR(1),
                                   SUBSTRING(display_text FROM LOCATE('}}@', display_text) + 3))
        
        WHERE LOCATE('@{{"user":', display_text);
    UNTIL !ROW_COUNT() END REPEAT;
    UPDATE comments
    SET display_text = REPLACE(REPLACE(display_text, CHAR(0), '@{{"user":'), CHAR(1), '}}@');
END

DEMO fiddle

关于mysql - mysql 是否可以动态翻译存储在字符串中的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65361971/

相关文章:

python - 在整个数据框python中同时替换多个值

regex - Powershell正则表达式组替换

regex - 如何使用 sed 和正则表达式替换(特殊)字符和数字的任意组合

php - IOS 连接到 PHP webserver 插入数据到 mysql

php - 设置服务器端脚本以连续记录来自数据库中 API 的流式 JSON 数据?

python - Pandas .str.replace 和不区分大小写

替换列表列表中的元素

mysql - 为什么唯一键的列名在括号中重复?

mysql - filemaker 小结的 sql 等价物是什么?

php - 30 个唯一变量的 SQL 查询