'朋友的朋友' SQL查询

时间:2017-05-11 10:46:07

标签: mysql sql

这个问题与前一个问题有关。您可以查看我的第一篇帖子here

我试图从用户表中提取数据,我需要朋友的朋友,那些距选定用户两步但未直接连接到所选用户的人用户

我尝试了这个查询:

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

3 个答案:

答案 0 :(得分: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的需要。

答案 1 :(得分: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子句验证了第二级朋友也不是第一级朋友。

答案 2 :(得分:0)

我使用非相关子查询,该子查询检索<div class="names-container"> <ul> <li ng-repeat="name in vm.namesCollection"> <span>{{ ::name.first }}</span> <span>{{ ::name.second }}</span> </li> </ul> </div> 的直接友谊的ID,并从最终结果中排除这些用户:

{$user_id}