2013-02-06 3 views
0

Je suis un cours de base de données et je suis bloqué sur l'une des questions. "Pour tous les cas où A est ami avec B, et B est ami avec C, ajoutez une nouvelle amitié pour la paire A et C". Ce est aussi loin que j'aiValeur d'insertion SQL dans la table d'amitié basée sur

INSERT INTO 
    friend 
SELECT DISTINCT 
    f1.ID1, f2.ID1 
FROM 
    friend f1 
    JOIN friend f2 using (ID2), 
    friend 
WHERE 
    f1.ID1 <> f2.ID1 
AND friend.ID1 <> f1.ID1 
AND friend.ID2 <> f1.ID2 

Le schéma est ici http://www.sqlfiddle.com/#!5/cf8b5/23

Je me demande si quelqu'un pouvait me donner quelques conseils sur la façon de procéder. Merci.

+0

Juste un conseil - vous devez spécifier les colonnes que vous souhaitez insérer dans le la table 'friend'. – Bridge

Répondre

2

Je pense que vous avez les concepts de base.

que je le ferais comme ce qui suit:

INSERT INTO friend 
(ID1, ID2) 
SELECT DISTINCT f1.ID1, f2.ID2 
FROM friend f1 
    INNER JOIN f2 
    ON f1.ID2 = f2.ID1 
     AND f1.ID1 <> f2.ID1 
     AND f1.ID2 <> f2.ID2 
WHERE f1.ID1 <> f2.ID2 
+0

La question demande des * nouvelles * amitiés, vous devriez donc vérifier que l'enregistrement n'existe pas déjà. –

+0

Merci Marlin, cela fonctionne. Mais comme l'a souligné CL, je peux voir que je dois me débarrasser des doublons. Bien sûr, la réponse ne doit contenir que de nouvelles amitiés. Aidez-moi? – NinaC

+0

Merci les gars pour votre contribution. J'ai filtré les doublons avec "sauf SELECT * FROM friend" et maintenant c'est OK. – NinaC

0

Tout d'abord, je ne vois pas l'intérêt d'avoir à la fois des tables FRIEND et LIKES.

Si l'amitié est représentée par deux lycéens se ressemblant qu'une seule table avec deux colonnes d'ID est suffisante.

+0

Ceci n'est pas une réponse; et la table 'Friend' * a * deux colonnes d'ID. –

+0

Eh bien, apparemment la table FRIEND contient des amitiés mutuelles alors que la table LIKES n'est pas réciproque, je veux dire que cette personne A peut aimer quelqu'un mais que quelqu'un n'aime pas forcément la personne A. – NinaC

+0

Cela signifie-t-il que si A est ami avec B et B est ami avec C et A aime C MAIS C n'aime pas A, alors A ne peut pas être ami avec C? – Lupuss

1

Je pense qu'il peut être:

INSERT INTO friend 
(ID1, ID2) 
SELECT DISTINCT h.ID, f2.ID2 
FROM Highschooler h 
inner join friend f1 on(h.ID=f1.ID1) 
inner join friend f2 on(f1.ID2=f2.ID1) 
where h.ID <> f2.ID2 
and not exists(select * 
       from friend f3 
       where f3.ID1=h.ID 
       and f3.ID2 = f2.ID2) 
0
insert into friend 
select f1.id1, f2.id2 
from friend f1 join friend f2 on f1.id2 = f2.id1 
where f1.id1 <> f2.id2 
except 
select * from friend 
Questions connexes