如何为 MySQL 中另一个 table 的每个条目更新 table 的每个条目
How to update each entry of a table for each entry of another table in MySQL
我尝试通过映射 table 替换其中的文本来更新 table。
我提出的解决方案有效,但仅适用于一个条目。
如何为 id_mapping table 中的每个条目更新 item 的所有条目?
示例 tables:
DROP TEMPORARY TABLE IF EXISTS `item`;
DROP TEMPORARY TABLE IF EXISTS `id_mapping` ;
CREATE TEMPORARY TABLE IF NOT EXISTS `item` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`type` INT DEFAULT 1,
`text` VARCHAR(200) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=MEMORY;
CREATE TEMPORARY TABLE IF NOT EXISTS `id_mapping` (
`old_id` INT NOT NULL,
`new_id` INT NOT NULL,
PRIMARY KEY (old_id, new_id)
)
COLLATE='utf8_general_ci'
ENGINE=MEMORY;
INSERT INTO `item` (`type`, `text`)
VALUES
(1, '<span><a href="item_id=111">Link</a></span>'),
(1, '<span><a href="item_id=222">Link</a></span>'),
(1, '<span><a href="item_id=333">Link</a></span>'),
(2, '<span><a href="item_id=444">Link</a></span>');
INSERT INTO `id_mapping` (`old_id`, `new_id`)
VALUES
(111, 999),
(222, 888),
(333, 777),
(444, 666);
项目
id
type
text
1
1
<span><a href="item_id=111">Link</a></span>
2
1
<span><a href="item_id=222">Link</a></span>
3
1
<span><a href="item_id=333">Link</a></span>
4
2
<span><a href="item_id=444">Link</a></span>
id_mapping
old_id
new_id
111
999
222
888
333
777
444
666
我想出的更新查询应该更新所有条目,但实际上只更新第一个条目:
UPDATE `id_mapping` m, `item` i
SET i.`text` = REPLACE(
i.`text`,
CONCAT('item_id=',m.old_id),
CONCAT('item_id=',m.new_id)
)
WHERE i.`type` = 1;
更新执行后变为:
项目
id
type
text
1
1
<span><a href="item_id=999">Link</a></span>
2
1
<span><a href="item_id=222">Link</a></span>
3
1
<span><a href="item_id=333">Link</a></span>
4
2
<span><a href="item_id=444">Link</a></span>
我的预期:
项目
id
type
text
1
1
<span><a href="item_id=999">Link</a></span>
2
1
<span><a href="item_id=888">Link</a></span>
3
1
<span><a href="item_id=777">Link</a></span>
4
2
<span><a href="item_id=444">Link</a></span>
我是不是对这个的基本概念做错了什么?
您需要以某种方式连接表格。例如
UPDATE `item` i
JOIN `id_mapping` m ON i.text like concat('%item_id=', m.old_id,'%' )
SET i.`text` = REPLACE(
i.`text`,
CONCAT('item_id=',m.old_id),
CONCAT('item_id=',m.new_id)
)
WHERE i.`type` = 1;
我尝试通过映射 table 替换其中的文本来更新 table。 我提出的解决方案有效,但仅适用于一个条目。
如何为 id_mapping table 中的每个条目更新 item 的所有条目?
示例 tables:
DROP TEMPORARY TABLE IF EXISTS `item`;
DROP TEMPORARY TABLE IF EXISTS `id_mapping` ;
CREATE TEMPORARY TABLE IF NOT EXISTS `item` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`type` INT DEFAULT 1,
`text` VARCHAR(200) NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=MEMORY;
CREATE TEMPORARY TABLE IF NOT EXISTS `id_mapping` (
`old_id` INT NOT NULL,
`new_id` INT NOT NULL,
PRIMARY KEY (old_id, new_id)
)
COLLATE='utf8_general_ci'
ENGINE=MEMORY;
INSERT INTO `item` (`type`, `text`)
VALUES
(1, '<span><a href="item_id=111">Link</a></span>'),
(1, '<span><a href="item_id=222">Link</a></span>'),
(1, '<span><a href="item_id=333">Link</a></span>'),
(2, '<span><a href="item_id=444">Link</a></span>');
INSERT INTO `id_mapping` (`old_id`, `new_id`)
VALUES
(111, 999),
(222, 888),
(333, 777),
(444, 666);
项目
id | type | text |
---|---|---|
1 | 1 | <span><a href="item_id=111">Link</a></span> |
2 | 1 | <span><a href="item_id=222">Link</a></span> |
3 | 1 | <span><a href="item_id=333">Link</a></span> |
4 | 2 | <span><a href="item_id=444">Link</a></span> |
id_mapping
old_id | new_id |
---|---|
111 | 999 |
222 | 888 |
333 | 777 |
444 | 666 |
我想出的更新查询应该更新所有条目,但实际上只更新第一个条目:
UPDATE `id_mapping` m, `item` i
SET i.`text` = REPLACE(
i.`text`,
CONCAT('item_id=',m.old_id),
CONCAT('item_id=',m.new_id)
)
WHERE i.`type` = 1;
更新执行后变为:
项目
id | type | text |
---|---|---|
1 | 1 | <span><a href="item_id=999">Link</a></span> |
2 | 1 | <span><a href="item_id=222">Link</a></span> |
3 | 1 | <span><a href="item_id=333">Link</a></span> |
4 | 2 | <span><a href="item_id=444">Link</a></span> |
我的预期:
项目
id | type | text |
---|---|---|
1 | 1 | <span><a href="item_id=999">Link</a></span> |
2 | 1 | <span><a href="item_id=888">Link</a></span> |
3 | 1 | <span><a href="item_id=777">Link</a></span> |
4 | 2 | <span><a href="item_id=444">Link</a></span> |
我是不是对这个的基本概念做错了什么?
您需要以某种方式连接表格。例如
UPDATE `item` i
JOIN `id_mapping` m ON i.text like concat('%item_id=', m.old_id,'%' )
SET i.`text` = REPLACE(
i.`text`,
CONCAT('item_id=',m.old_id),
CONCAT('item_id=',m.new_id)
)
WHERE i.`type` = 1;