2010-05-10 4 views
8

Meine MySQL-Tabellen Struktur ist wie folgt.SQL, um Freunde und Freunde von Freunden eines Benutzers zu erhalten

USER 
int id 
varchar username 

FRIEND_LIST 
int user_id 
int friend_id 

Für jeden Freund Beziehung einfügen I 2 Datensätze in FRIEND_LIST. Wenn Benutzer 1 ist der Freund von Benutzer 2 dann die nächsten Zeilen in FRIEND_LIST eingefügt werden

1,2 
2,1 

ich die Freunde und Freunde von Freunden von einem bestimmten Benutzer erhalten möchten.

Die Auswahl sollte die Spalten a, b, c zurückgeben.

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 

Kann ich diese Zeilen mit einer einzigen Abfrage erhalten:

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 

die Abfrage dann 1en sollten Freunde und Freunde von Freunden zu erhalten zurückkehren

UPDATE ANTWORT: Ich habe die Antwort von DVK ein bisschen geändert und dies ist die Abfrage, die zurückgibt, was ich gesucht habe.

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; 

Antwort

1

Dies ist weniger effizient, aber lesbar:

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 

ODER

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

ich die erste Abfrage versucht, aber es sagt, dass User_id mehrdeutig ist – Enrique

+0

ich den ersten verwenden werden Frage, die zweite gab mir falsche Ergebnisse. Vielen Dank! – 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

Hallo Ich habe versucht, die Abfrage, aber es gibt auch die Freunde von Freunden von Freunden. In dem obigen Beispiel gibt es auch die Freunde von 4,5,6,7 – Enrique

+0

Yep, meine schlechte ... Ich habe versucht, Union zu vermeiden, aber das scheint nicht zu funktionieren ... – a1ex07

+0

Es scheint zu funktionieren jetzt ... – a1ex07

Verwandte Themen