2017-10-15 53 views
1

我的工作标签系统上比较添加元素表,我有一个表,下面列(&标签岗位之间的映射):

删除,并通过与其他表(表DIFF)

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

我有一个包含标签的ID应该是这个职位的临时表(它包含唯一ID列)

id 
9 
3 
66 

我想(基于SQL)来实现一个功能,用户可以修改标签(添加/删除) - 如果用户删除标签,我想知道从第一个表中删除了什么id,并且如果添加了新的标记,我想知道它应该添加到第一个表中。

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

我正在寻找助理来创建这样的SQL查询。 谢谢!

回答

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

我们可以用一个味或其他(左或右)外连接在两个方向上找到无与伦比的价值。

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

工作就像一个魔术!谢谢! – Shushi

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中删除标签ID时,也从表1中删除标签ID。

表2中只有标签ID将在表1中