2017-05-11 232 views
3

此問題與上一個相關。你可以檢查我的第一篇here'朋友的朋友'SQL查詢

我試圖從一個用戶表中提取數據,我需要「朋友的朋友」,那些誰走了兩步,從所選擇的用戶但不直接連接到用戶選擇

我試圖與此查詢:

select 
u.* 
from user u 
    inner join friend f 
    on u.user_id = f.friend_id 
     inner join friend ff 
     on f.user_id = ff.friend_id 
where ff.user_id = {$user_id} AND u.user_id <> {$user_id}; 

我不知道怎麼拉誰沒有直接連接到所選用戶的用戶。我得到當前用戶的朋友的所有朋友,但我得到當前用戶的直接朋友。

enter image description here

回答

1

你只需要排除誰是那些直接的朋友以及成爲朋友的朋友。我已經重新安排了表的別名所以這是一個有點清晰(對我來說,反正)什麼正在檢索:

SELECT 
    u.* 
FROM 
    user u 
    INNER JOIN friend ff ON u.user_id = ff.friend_id 
    INNER JOIN friend f ON ff.user_id = f.friend_id 
WHERE 
    f.user_id = {$user_id} 
    AND ff.friend_id NOT IN 
    (SELECT friend_id FROM friend WHERE user_id = {$user_id}) 

它也消除了需要排除被查詢的用戶ID。

0

你是在正確的軌道上。您需要添加排除那些誰是直接相關的一個WHERE條件:

select u.* 
from user u 
inner join friend f on u.user_id = f.friend_id 
inner join friend ff on f.user_id = ff.friend_id 
where ff.user_id = {$user_id} AND u.user_id <> {$user_id}; 
     AND not exists 
      (select f2.friend_id 
      from friend f2 
      where f2.friend_id = ff.friend_id 
       and u.user_id = f2.user_id) 

,我添加到您的查詢中的額外not exists條款驗證第二學位的朋友也不是第一個學位的朋友。

0

我會使用一個非相關子查詢,它檢索的{$user_id}直接友誼的ID,並排除最終結果這些用戶:

select u.* 
from user u 
inner join friend f on u.user_id = f.friend_id 
inner join friend ff on f.user_id = ff.friend_id 
where ff.user_id = {$user_id} AND u.user_id <> {$user_id} 
     AND u.user_id not in (
      select directFriend.friend_id 
      from friend directFriend 
      where directFriend.user_id = {$user_id})