В поисках общего друга 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