Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 替换值中的列引用_Mysql_Sql - Fatal编程技术网

Mysql 替换值中的列引用

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 )

我有一个表,它有两列(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
);

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-不用担心,但是你为什么不用你当前问题中的实际数据更新你的问题,这样我(和其他人)就可以解决实际问题。谢谢,但不幸的是,这还不够。有可能, Word=1/代码>位于两个其他键值对的中间。没关系,你给了我一个很好的想法。用我需要的查询更新了问题。谢谢你的帮助!不客气,很高兴我能帮忙!