2016-03-19 63 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 

然後,在UserId加入其中兩個UNION爲兩個不同的用戶,你可以得到共同的朋友:

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

這個查詢返回共同朋友的ID,你可以通過將這個查詢的結果加入到你的'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