Mysql 替换值中的列引用
我有一个表,它有两列(id和word)。我还有一个表,它有一个数据列,它的值引用了第一个表中的单词。下面是一个示例代码:Mysql 替换值中的列引用,mysql,sql,Mysql,Sql,我有一个表,它有两列(id和word)。我还有一个表,它有一个数据列,它的值引用了第一个表中的单词。下面是一个示例代码: CREATE TABLE `words` ( `id` TINYINT, `word` VARCHAR(50), PRIMARY KEY (`id`) ); INSERT INTO `words` VALUES (1, 'one'), (2, 'two'), (3, 'three'); CREATE TABLE `data` ( `data` TEXT )
CREATE TABLE `words` (
`id` TINYINT,
`word` VARCHAR(50),
PRIMARY KEY (`id`)
);
INSERT INTO `words` VALUES (1, 'one'), (2, 'two'), (3, 'three');
CREATE TABLE `data` (
`data` TEXT
);
INSERT INTO `data` VALUES ('foo=bar\nword=one'), ('word=three');
我想将单词的引用替换为ID。因此,word=one
将变成word=1
,word=three
将变成word=3
,依此类推。我尝试了此查询,但不起作用:
UPDATE `data`, `words` SET `data`.`data` = REPLACE(`data`.`data`, CONCAT('word=', `words`.`word`), CONCAT('word=', `words`.`id`));
有什么建议或想法来实现我想要的吗?谢谢
编辑:忘记提到数据列是INI格式的,所以其他键值对也可以在字段中。调整了示例
编辑:由于@nortphole的想法,我成功地构建了我需要的查询:
UPDATE `data` SET `data`.`data` = REPLACE(`data`.`data`, CONCAT('word=', SUBSTRING_INDEX(SUBSTRING_INDEX(`data`.`data`, 'word=', -1), '\n', 1)), CONCAT('word=', (SELECT `id` FROM `words` WHERE `words`.`word` = SUBSTRING_INDEX(SUBSTRING_INDEX(`data`.`data`, 'word=', -1), '\n', 1))));
试着这样做:
UPDATE data
SET data = CONCAT('word=',(SELECT id
FROM words
WHERE words.word = SUBSTRING_INDEX(data.data,'=',-1)))
很抱歉,我这里没有MySql来测试它(请特别确保子字符串在'word='之后获得所有内容)
编辑:
我使用带有-1的substring_index来获取=符号的最后一个索引。这不是一个好的设计,不应该将这些字段合并到一列中。事实上,拥有
'word=one'
或'word=1'
之间没有实际区别。你想让它做动态SQL吗?“但它不起作用”具体发生了什么?你收到错误信息了吗?有任何行被修改过吗?@MarkByers没有,我没有收到错误消息。在本例中,word=one
被替换为word=1
,但word=three
不是。@Lamak我知道这是一个糟糕的设计,但这是一个现有的应用程序,我现在无法更改它。数据列的值是INI格式的,所以在一个字段中可以有更多的键值对,我只是简单介绍了这个示例。这对于示例数据非常有效。问题是数据列采用INI格式,因此foo=bar\nword=one
(其中\n是新行字符)也可以是值。在这种情况下,您的解决方案不起作用。看起来我把这个例子做得太简单了,很抱歉。@GergoErdosi-不用担心,但是你为什么不用你当前问题中的实际数据更新你的问题,这样我(和其他人)就可以解决实际问题。谢谢,但不幸的是,这还不够。有可能,