2013-01-01 66 views
0

我正在接管某人elses項目,並需要制定一個php mysql查詢來找出朋友表中的共同朋友。Mysql查詢找到共同的朋友

表看起來像下面 - 我的例如ID是1,我在看的軌跡具有5

一個id的共同的朋友ID的輸出將是3

rel 1 | rel 2 
-------------- 
1  | 5 
5  | 1 
3  | 5 
5  | 3 
1  | 3 
3  | 1 

編號的樣子,就像他們在兩次(雙向)漲

不能讓我的頭一輪需要

+0

不能你使用SQL 1和5的每一件事,然後用PHP來弄明白? –

+0

這可以幫助你:http://stackoverflow.com/questions/8906154/mysql-select-mutual-friends – Nathan

回答

-1

SQL Fiddle測試

select f.friend 
from (select rel1, rel2 as friend 
     from friends 
     where rel1 in (1, 5) 
     union 
     select rel2, rel1 
     from friends 
     where rel2 in (1, 5)) f 
group by f.friend 
having count(*) > 1 
+0

這將是過濾掉雙打(如果他們確實是雙打,如果字段交換)的一種方式,但這種查詢不會給你所要求的共同朋友。 – GolezTrol

+0

非常感謝Olaf,感謝大家的幫助 – Jeff

0

它看起來像的關係是雙向查詢。也許這是一個錯誤,或者也許這個系統可以選擇與某人成爲朋友,而沒有他們成爲你的朋友。

假設是後者,你只需要看看其中一列,讓您的查詢看起來是這樣的:

select 
    rel2 
from 
    YourTable 
where 
    rel1 in (1, 5) 
group by 
    rel2 
having 
    count(*) > 1 

計數顯然有隻選擇有一個以上的那些朋友(1,5)中的朋友。假定rel1和rel2的組合是唯一的。

如果數據確實不正確,你可以「解決」,通過使用兩個查詢在此表上的聯合,選擇所有組合。但是,請注意,如果是這種情況,最好修復數據,因爲正如您所看到的,如果您的查詢需要修復數據,您的查詢將很快變得無法讀取(當然也會變慢)。

select 
    rel2 
from 
    (select distinct 
    rel1, rel2 
    from 
     (select 
     rel1, rel2 
     from 
     YourTable 
     union all 
     select 
     rel2, rel1 
     from 
     YourTable) x) y 
where 
    rel1 in (1, 5) 
group by 
    rel2 
having 
    count(*) > 1