繁体   English   中英

'朋友的朋友'的SQL查询

[英]'friends of friends' SQL query

这个问题与前一个问题有关。 你可以在这里查看我的第一篇文章

我正在尝试从用户表中提取数据,我需要“朋友的朋友”,那些距离所选用户只有两步但没有直接连接到所选用户的人

我试过这个查询:

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};

我不知道如何拉动没有直接连接到所选用户的用户。 我得到了当前用户朋友的所有朋友,但我得到了当前用户的直接朋友。

在此输入图像描述

你只需要排除那些直接的朋友以及成为朋友的朋友。 我重新安排了表别名,所以它更清楚(对我来说,无论如何)正在检索的内容:

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的需要。

你走在正确的轨道上。 您需要添加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)

我添加到您的查询中的extra not exists子句验证了二级朋友也不是一级朋友。

我使用一个非相关的子查询,它检索{$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})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM