2010-05-10 43 views
8

Mi estructura de tablas MySQL es así.SQL para obtener amigos Y amigos de amigos de un usuario

USER 
int id 
varchar username 

FRIEND_LIST 
int user_id 
int friend_id 

Para cada relación de amistad, inserto 2 registros en FRIEND_LIST. Si el usuario 1 es amigo del usuario 2 a continuación, las siguientes filas se insertan en FRIEND_LIST

1,2 
2,1 

quiero conseguir los amigos y amigos de amigos de un usuario específico.

La selección debe devolver las columnas 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 

A continuación, la consulta de conseguir a amigos y amigos de amigos de 1 debería volver:

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 

puedo conseguir este filas con una sola consulta?

ACTUALIZACIÓN RESPUESTA: Modifiqué la respuesta de DVK un poco y esta es la consulta que devuelve lo que estaba buscando.

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; 

Respuesta

1

Esto es menos eficiente pero legible:

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 

O

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

probé la primera consulta, pero se dice que user_id es ambigua – Enrique

+0

Voy a usar la primera consulta, el segundo me dio resultados incorrectos. ¡Muchas gracias! – 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

Hola probé la consulta pero también devuelve los amigos de amigos de amigos. En el ejemplo anterior, también devuelve los amigos de 4,5,6,7 – Enrique

+0

sí, mi mal ... He intentado evitar la unión, pero eso no parece estar funcionando ... – a1ex07

+0

Parece que funciona ahora ... – a1ex07

Cuestiones relacionadas