2010-05-10 6 views
8

Ma structure de tables MySQL est comme ça.SQL pour obtenir des amis ET amis d'amis d'un utilisateur

USER 
int id 
varchar username 

FRIEND_LIST 
int user_id 
int friend_id 

Pour chaque relation d'ami, j'insère 2 enregistrements dans FRIEND_LIST. Si l'utilisateur 1 est ami de l'utilisateur 2 alors les lignes suivantes sont insérées dans FRIEND_LIST

1,2 
2,1 

Je veux les amis et amis d'amis d'un utilisateur spécifique.

La sélection doit retourner les colonnes a, b, c.

a: user_id 
b: friend_id 
c: username (username of friend_id) 

If 1 is friend of 2 and 3. 
2 is friend of 3, 4 and 5 
3 is friend of 5,6,7 

Ensuite, la requête pour obtenir 1 amis et amis d'amis doivent retourner:

1 2 two 
1 3 three 
2 1 one 
2 3 three 
2 4 four 
2 5 five 
3 1 one 
3 5 five 
3 6 six 
3 7 seven 

Puis-je obtenir cette lignes d'une seule requête?

MISE À JOUR RÉPONSE: J'ai modifié un peu la réponse de DVK et c'est la requête qui renvoie ce que je cherchais.

SELECT friends.user_id, friends.friend_id, username 

FROM 
     FRIEND_LIST friends, USER 

WHERE 
     CAT_USER.id = friends.friend_id 
AND 
     friends.user_id = 1 

UNION 

SELECT 
     fof.user_id, fof.friend_id, username 
FROM 
     FRIEND_LIST friends, FRIEND_LIST fof, USER 
WHERE 
     USER.id = fof.friend_id 
AND 
     friends.friend_id = fof.user_id 
AND 
     friends.user_id = 1; 

Répondre

1

Ceci est moins efficace mais lisible:

SELECT friends.user_id, friends.friend_id, username 
FROM FRIEND_LIST friends, USER 
WHERE USER.id   = friends.friend_id 
AND USER.id = 1 
UNION 

SELECT USER.user_id, fof.friend_id, username 
FROM FRIEND_LIST friends, FRIEND_LIST fof, USER 
WHERE USER.id   = fof.friend_id 
AND friends.friend_id = fof.user_id 
AND USER.id = 1 

OU

SELECT user_id, f_fof.friend_id, username 
FROM USER, (
    SELECT f.user_id, f.friend_id 
    FROM FRIEND_LIST f 
    WHERE user_id = 1 
    UNION 
    SELECT f.user_id, fof.friend_id 
    FROM FRIEND_LIST f, FRIEND_LIST fof 
    WHERE user_id = 1 
    AND f.friend_id = fof.user_id 
) as f_fof 
WHERE USER.id   = f_fof.friend_id 
+0

J'ai essayé la première requête, mais il est dit que user_id est ambigu – Enrique

+0

je vais utiliser la première requête, le second m'a donné des résultats erronés. Merci beaucoup! – Enrique

2
SELECT f1.user_id, f1.friend_id FROM 
friends_info f1 
WHERE f1.user_id = 1 OR 
f1.user_id IN 
(
select f2.friend_id 
from friends_info f2 
where f2.user_id = 1 
) 
ORDER BY user_id 
+0

Bonjour j'ai essayé la requête mais elle renvoie aussi les amis d'amis d'amis. Dans l'exemple ci-dessus, il renvoie également les amis de 4,5,6,7 – Enrique

+0

oui, mon mauvais ... J'ai essayé d'éviter l'union, mais cela ne semble pas fonctionner ... – a1ex07

+0

Il semble fonctionner maintenant ... – a1ex07

Questions connexes