2017-10-15 15 views
1

je travaille sur un système de marquage, j'ai une table (correspondance entre les messages & tags) avec les colonnes ci-dessous:

Retirez et ajouter des éléments à la table en comparant avec d'autres tables (tables diff)

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

J'ai table temporaire qui contient l'identifiant des balises qui doivent être pour le poste (il contient seulement colonne id)

id 
9 
3 
66 

Je veux mettre en œuvre une fonctionnalité (base SQL) que l'utilisateur peut modifier les balises (ajouter/remove) - Si l'utilisateur supprime un tag , Je veux savoir quels identifiants enlever de la première table et si une nouvelle étiquette est ajoutée, je veux savoir qu'il devrait être ajouté à la première table.

Dans l'exemple ci-dessous, l'étiquette 17 sera supprimée de la table et l'étiquette 66 sera ajoutée.

Je cherche un assistant pour créer une telle requête SQL. Merci!

Répondre

0

est ici la configuration:

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

Nous pouvons utiliser une jointure externe d'une saveur ou l'autre (gauche ou droite) pour trouver des valeurs inégalées dans les deux sens.

Nous pouvons les utiliser pour formater de nouvelles instructions SQL, qui peuvent ensuite être exécutées en utilisant PREPARE et EXECUTE pour appliquer les changements.

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; 

Sortie:

+---------------------------------------------------------+ 
| _sql             | 
+---------------------------------------------------------+ 
| DELETE FROM mapping WHERE post_id=8 AND tag_id IN (17); | 
| INSERT INTO mapping (post_id, tag_id) VALUES (8, 66); | 
+---------------------------------------------------------+ 
+0

Travaillé comme une magie! Je vous remercie! – Shushi

0

Vous pouvez y parvenir en ajoutant une clé étrangère à table1. Lorsqu'un identifiant TAG est supprimé de la table 2, l'identifiant TAG est également supprimé de la table 1.

Seuls les ID de balise dans Table2 seront dans TABLE1