[英]'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.