Как обновить каждую запись таблицы для каждой записи другой таблицы в MySQL

#mysql #sql #sql-update

Вопрос:

Я пытаюсь обновить таблицу, заменив текст в ней таблицей сопоставления. Решение, которое я придумал, работает, но только для одной записи.

Как я могу обновить все записи элемента для каждой записи в таблице id_mapping?

Примеры таблиц:

 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 Тип текст
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>

сопоставление идентификаторов

old_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 Тип текст
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 Тип текст
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>

Я делаю что-то не так с основной концепцией этого?

Ответ №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;