В поисках общего друга sql

На самом деле у меня есть 2 таблицы: таблица друзей и таблица пользователей. Я пытаюсь добиться того, чтобы восстановить моего общего друга, проверив друга другого пользователя и получить данные этого общего друга из таблицы пользователей.

друг за столом такой

id | user1 | user2 | friend_status

тогда данные таблицы выглядят так

1 | 1 | 2 | 1
2 | 1 | 3 | 1
3 | 2 | 3 | 1
4 | 1 | 4 | 1
5 | 2 | 4 | 1

Тогда давайте предположим, что я пользователь с идентификатором 2, затем в этой таблице у меня есть 3 друга - 1, 3 и 4. Я хочу получить общих друзей с пользователем 1, у которых также есть 3 друга - 2, 3 и 4. и получить данные из таблицы пользователей для 2 общих общих друзей 3 и 4

3 ответа

Решение

Вы можете использовать UNION чтобы получить друзей пользователей:

SELECT User2 UserId FROM friends WHERE User1 = 1
  UNION 
SELECT User1 UserId FROM friends WHERE User2 = 1

Затем, присоединившись к двум из них UNION для двух разных пользователей на UserId Вы можете получить общих друзей:

SELECT UserAFriends.UserId FROM
(
  SELECT User2 UserId FROM friends WHERE User1 = 1
    UNION 
  SELECT User1 UserId FROM friends WHERE User2 = 1
) AS UserAFriends
JOIN  
(
  SELECT User2 UserId FROM friends WHERE User1 = 2
    UNION 
  SELECT User1 UserId FROM friends WHERE User2 = 2
) AS UserBFriends 
ON  UserAFriends.UserId = UserBFriends.UserId

Вот способ использования union all объединить всех друзей пользователя 1 и пользователя 2 и используя count(distinct src) > 1 выбрать только те, которые дружат с обоими пользователями.

select friend from (
    select 2 src, user1 friend from friends where user2 = 2
    union all select 2, user2 from friends where user1 = 2
    union all select 1, user1 from friends where user2 = 1
    union all select 1, user2 from friends where user1 = 1
) t group by friend
having count(distinct src) > 1

Вам нужно что-то подобное?

create table #table (id int, user1 int , user2 int, friend_status int)

insert into #table values

(1 , 1 , 2 , 1),
(2 , 1 , 3 , 1),
(3 , 2 , 3 , 1),
(4 , 1 , 4 , 1),
(5 , 2 , 4 , 1),
(6 , 2 , 1 , 1),
(7,  3 , 7 , 1)

select *from #table

select t1.user1, t1.user2 as friend
from #table t1
inner join
#table  t2
on (t1.user2 = t2.user2
and t1.user1 <> t2.user1)
where t1.user1<>2
order by t1.user1
Другие вопросы по тегам