我正在使用标记系统,我有一个表格(在帖子和标签之间映射),下面的列:
post_id,tag_id
8,9
8,17
8,3
我有临时表,其中包含标签'应该是帖子的id(它只包含id列)
id
9
3
66
我想实现一个功能(基于SQL),用户可以修改标签(添加/删除) - 如果用户删除标签,我想知道从第一个表中删除哪些ID以及是否添加了新标签,我想知道它应该被添加到第一个表中。
在下面的示例中,标签17将从表格中删除,标签66将被添加。
我正在寻找创建这样一个SQL查询的助手。 谢谢!
答案 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中