SQL, чтобы получить друзей и друзей друзей пользователя - PullRequest
8 голосов
/ 11 мая 2010

Моя структура таблиц MySQL выглядит следующим образом.

USER
int id
varchar username

FRIEND_LIST
int user_id
int friend_id

Для каждой дружеской связи я вставляю 2 записи в FRIEND_LIST. Если пользователь 1 является другом пользователя 2, то следующие строки вставляются в FRIEND_LIST

1,2
2,1

Я хочу получить друзей и друзей друзей конкретного пользователя.

Выбор должен возвращать столбцы 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

Тогда запрос для получения 1 друзей и друзей друзей должен вернуться:

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

Можно ли получить эти строки одним запросом?

ОБНОВЛЕНИЕ ОТВЕТА: Я немного изменил ответ DVK, и этот запрос возвращает то, что я искал.

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;

Ответы [ 2 ]

2 голосов
/ 11 мая 2010
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
1 голос
/ 11 мая 2010

Это менее эффективно, но читабельно:

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

OR

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...