Взаимные друзья sql с join (Mysql) - PullRequest
2 голосов
/ 18 июля 2011

У меня есть две таблицы

таблица пользователей:

id|name

user_relationships

id | user_id | friend_id

и хотите получить имена общих друзей 2 пользователей. то есть:

user_relationships
1 | 1 | 3
2 | 2 | 3  

users
3| sammy

пользователи 1 и 2 имеют общего друга 3. Я хочу получить его имя 'sammy' в одном запросе.

Как мне это сделать?

Ответы [ 4 ]

6 голосов
/ 18 июля 2011
SELECT id, name
FROM users
WHERE id IN (
  SELECT friend_id
  FROM user_relationships
  WHERE user_id IN ( 1, 2 )
  GROUP BY friend_id
  HAVING COUNT(friend_id) >= 2
)

или с одним соединением:

SELECT friend_id, name
FROM user_relationships r
  INNER JOIN users u ON r.friend_id = u.id
WHERE user_id IN ( 1, 2 )
GROUP BY friend_id
HAVING COUNT(friend_id) >= 2
6 голосов
/ 18 июля 2011

Вам нужно объединить user_relationships с собой, чтобы две строки с разными user_id имели одинаковые friend_id

Все общие друзья:

select ur1.user_id user1, 
       ur2.user_id user2, 
       ur2.friend_id mutual_friend
from   user_relationships ur1 
       JOIN user_relationships ur2 ON  ur1.friend_id = ur2.friend_id
where  ur1.user_id != ur2.user_id

Присоединиться к таблице пользователейполучить имена:

select ur1.user_id user_id1, 
        u1.name User1, 
       ur2.user_id user2, 
        u2.name User2,
       ur2.friend_id mutual_friend_id,
        u3.name mutual_friend
from user_relationships ur1 
     JOIN user_relationships ur2 ON  ur1.friend_id = ur2.friend_id
     JOIN user u1 ON u1.user_id = ur1.user_id
     JOIN user u2 ON u1.user_id = ur2.user_id
     JOIN user u3 ON ur1.user_id = u3.user_id
where ur1.user_id != ur2.user_id

Вы можете отфильтровать общих друзей для некоторых конкретных пользователей, используя ur1.user_id = first_user и ur2.user_id = second_user

0 голосов
/ 18 июля 2011

не проверял, но этот запрос должен дать вам список связанных имен пользователей для идентификатора [нет].

select u1.name, u2.name 
  from users as u1
  join user_relationships as ur
    on u1.id = ur.user_id
  join users as u2
    on ur.friend_id = u2.id
  where U1.id = [no];

Кстати, вам не нужен искусственный идентификатор для кросс-таблицы, поскольку (user_id, friend_id) уже является допустимым первичным ключом.

0 голосов
/ 18 июля 2011

Вы можете попробовать что-то вроде этого:

select id, name from users where id in 
    (select friend_id from user_relationships where user_id = @user1_id and friend_id in 
        (select friend_id from user_relationships where user_id = @user2_id)
    )

Это должно вернуть всех общих друзей пользователей с идентификаторами @ user1_id и @ user2_id. Это еще не проверено, но должно обеспечить отправную точку ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...