这里的设置:
CREATE TABLE mapping (post_id INT, tag_id INT, PRIMARY KEY (post_id, tag_id));
INSERT INTO mapping VALUES (8,9),(8,17),(8,3);
CREATE TABLE temp_mapping (tag_id INT PRIMARY KEY);
INSERT INTO temp_mapping VALUES (9),(3),(66);
我们可以用一个味或其他(左或右)外连接在两个方向上找到无与伦比的价值。
我们可以使用它们来格式化新的SQL语句,然后可以使用PREPARE和EXECUTE执行以应用更改。
SELECT CONCAT('DELETE FROM mapping WHERE post_id=8 AND tag_id IN (', GROUP_CONCAT(m.tag_id), ');') AS _sql
FROM mapping m
LEFT OUTER JOIN temp_mapping t ON m.tag_id = t.tag_id
WHERE m.post_id = 8 AND t.tag_id IS NULL
UNION ALL
SELECT CONCAT('INSERT INTO mapping (post_id, tag_id) VALUES ', GROUP_CONCAT(CONCAT('(8, ', t.tag_id, ')')), ';')
FROM mapping m
RIGHT OUTER JOIN temp_mapping t ON m.tag_id = t.tag_id AND m.post_id = 8
WHERE m.tag_id IS NULL;
输出:
+---------------------------------------------------------+
| _sql |
+---------------------------------------------------------+
| DELETE FROM mapping WHERE post_id=8 AND tag_id IN (17); |
| INSERT INTO mapping (post_id, tag_id) VALUES (8, 66); |
+---------------------------------------------------------+
工作就像一个魔术!谢谢! – Shushi