2017-02-14 114 views
3

這裏是我的表結構:如何限制選擇只有具有共同價值的行?

// users 
+----+--------+ 
| id | name | 
+----+--------+ 
| 1 | Jack | 
| 2 | Peter | 
| 3 | John | 
| 4 | Barman | 
| 5 | Ali | 
+----+--------+ 

// friends 
+---------+-----------+ 
| user_id | friend_id | 
+---------+-----------+ 
| 1  | 3   | 
| 1  | 4   | 
| 1  | 5   | 
| 3  | 1   | 
| 3  | 2   | 
| 3  | 4   | 
| 5  | 2   | 
+---------+-----------+ 

-- both user_id and friend_id columns refer to the id column of users table 

這裏是我的查詢:

// $id = 1; 
select distinct f1.user_id, f1.friend_id 
from friend f1 
where user_id = $id 
     or 
     user_id in (select f2.friend_id 
        from friend f2 
        where user_id = $id); 
/* output 
| 1  | 3   | 
| 1  | 4   | 
| 1  | 5   | 
| 3  | 2   | 
| 3  | 4   | 
| 5  | 2   | 

正如你看到的,我的查詢選擇

  • Jack(因爲$id = 1
  • 全部Jack的好友
  • Jack的朋友

好了所有罰款所有的朋友。實際上,我試圖對結果做一個圖表。其實我做到了。現在我想限制結果只有常見的朋友。我的意思是我想刪除單節點。換句話說,我想選擇至少有兩條邊的朋友

通過更改查詢或者我應該在PHP圖層中這樣做可能嗎?


視覺例子,它的預期輸出:

enter image description here

+0

添加SELECT COUNT條件在第二個'選擇..'應該做的工作。 – kawadhiya21

+0

更新您的問題,並添加您的選擇和預期結果的實際結果..(根據您的數據樣本) – scaisEdge

+0

@scaisEdge預期輸出添加。 – stack

回答

0

波紋管查詢將返回所有常見的朋友說,不是直接的朋友:

select distinct f.user_id, f2.friend_id common_friend 
from friends f 
inner join friends f2 
     on f.friend_id = f2.user_id 
left join friends f3 
     on f.user_id = f3.user_id 
     and f2.friend_id = f3.friend_id 
where f3.user_id is null 
and f.user_id <> f2.friend_id 
#and f.user_id = 1 Jack 

第一個「內'join返回朋友圈,第二個'left'join從圓圈加入一級好友 - > f3.user_id爲null的位置刪除first-訂購朋友。 最後的f.user_id <> f2.friend_id是刪除一個用戶成爲他自己的共同朋友。

0

試試這個

SELECT DISTINCT f1.user_id, f1.friend_id 
FROM friend f1 
WHERE (
    user_id = $id 
    OR user_id IN (
     SELECT f2.friend_id 
     FROM friend f2 
     WHERE user_id = $id)) 
    AND (friend_id IN (
     SELECT f3.friend_id 
     FROM friend f3 
     WHERE user_id = $id))