通过与其他表(表diff)进行比较,删除并向表中添加元素

时间:2017-10-15 19:40:51

标签: mysql sql stored-procedures

我正在使用标记系统,我有一个表格(在帖子和标签之间映射),下面的列:

post_id,tag_id
8,9
8,17
8,3

我有临时表,其中包含标签'应该是帖子的id(它只包含id列)

id
 9
 3
66

我想实现一个功能(基于SQL),用户可以修改标签(添加/删除) - 如果用户删除标签,我想知道从第一个表中删除哪些ID以及是否添加了新标签,我想知道它应该被添加到第一个表中。

在下面的示例中,标签17将从表格中删除,标签66将被添加。

我正在寻找创建这样一个SQL查询的助手。 谢谢!

2 个答案:

答案 0 :(得分:0)

以下是设置:

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);

我们可以使用一种香味或另一种香味(LEFT或RIGHT)的外部联接来找到任一方向的不匹配值。

我们可以使用它们来格式化新的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);   |
+---------------------------------------------------------+

答案 1 :(得分:0)

您可以通过向table1添加外键来实现此目的。

Create table Table2 (id integer, PRIMARY KEY (id) )

Create table TABLE1 (postid integer, tagid integer
                     CONSTRAINT fk_ctagid FOREIGN KEY (tagid)
                     REFERENCES Table2(id)
                       ON DELETE CASCADE)

从表2中删除TAG ID时,TAG Id也会从Table1中删除。

表2中只有标签ID在TABLE1中