2016-03-19 2 views
2

Фактически у меня есть 2 таблицы таблица друзей и таблица пользователей , что я пытаюсь достичь, - это восстановить мой общий друг, проверив друга другого пользователя и получив данные этого общего друга из таблицы пользователейПоиск взаимного друга sql

стол друг построен как этот

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 

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

+0

Мы говорим о MySql? – xpy

ответ

0

Вы можете использовать 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 
+0

спасибо xpy, но где я могу получить информацию о взаимном друге из таблицы пользователей в этом запросе? – Mireille28

+0

Этот запрос возвращает идентификаторы общих друзей, вы можете получить информацию, присоединив результаты этого запроса к вашей таблице 'users'. – xpy

0

Вам нужно что-то вроде этого?

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 
+0

Он хочет общих друзей пользователя 1 и пользователя 2 – xpy

+0

он выбирает только общих друзей – bmsqldev

+0

Если я получу это правильно, он соберет всех общих друзей пользователя с id 2 и всеми другими пользователями. – xpy

1

Вот способ использования 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