【问题标题】:How to update each entry of a table for each entry of another table in MySQL如何为 MySQL 中另一个表的每个条目更新一个表的每个条目
【发布时间】:2021-11-06 03:43:01
【问题描述】:

我尝试通过用映射表替换其中的文本来更新表。 我想出的解决方案有效,但仅适用于一个条目。

如何为 id_mapping 表中的每个条目更新 item 的所有条目?

示例表:

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 &lt;span&gt;&lt;a href="item_id=111"&gt;Link&lt;/a&gt;&lt;/span&gt;
2 1 &lt;span&gt;&lt;a href="item_id=222"&gt;Link&lt;/a&gt;&lt;/span&gt;
3 1 &lt;span&gt;&lt;a href="item_id=333"&gt;Link&lt;/a&gt;&lt;/span&gt;
4 2 &lt;span&gt;&lt;a href="item_id=444"&gt;Link&lt;/a&gt;&lt;/span&gt;

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 &lt;span&gt;&lt;a href="item_id=999"&gt;Link&lt;/a&gt;&lt;/span&gt;
2 1 &lt;span&gt;&lt;a href="item_id=222"&gt;Link&lt;/a&gt;&lt;/span&gt;
3 1 &lt;span&gt;&lt;a href="item_id=333"&gt;Link&lt;/a&gt;&lt;/span&gt;
4 2 &lt;span&gt;&lt;a href="item_id=444"&gt;Link&lt;/a&gt;&lt;/span&gt;

我的预期:

项目

id type text
1 1 &lt;span&gt;&lt;a href="item_id=999"&gt;Link&lt;/a&gt;&lt;/span&gt;
2 1 &lt;span&gt;&lt;a href="item_id=888"&gt;Link&lt;/a&gt;&lt;/span&gt;
3 1 &lt;span&gt;&lt;a href="item_id=777"&gt;Link&lt;/a&gt;&lt;/span&gt;
4 2 &lt;span&gt;&lt;a href="item_id=444"&gt;Link&lt;/a&gt;&lt;/span&gt;

我对这个的基本概念做错了吗?

【问题讨论】:

    标签: mysql sql sql-update


    【解决方案1】:

    您需要以某种方式连接表格。例如

    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;
    

    【讨论】:

      猜你喜欢
      • 2019-09-11
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2023-01-16
      相关资源
      最近更新 更多