"朋友的朋友"喜欢sql查询

brp*_*paz 6 mysql sql

我正在构建一个用户可以相互连接的应用程序(类似于任何社交网络中的朋友).

我在具有以下结构的表中保存连接:

id_user1 | id_user2 | is_accepted | is_blocked | created_at
Run Code Online (Sandbox Code Playgroud)

用户之间的连接是双向的,因此当连接两个用户时,表中只有一条记录.无论user_id是在里面id_user1还是在列中id_user2.

现在我需要写一个SQL查询来获取的已经不是用户的朋友一定用户的"朋友的朋友".此外,用户必须被接受而不被阻止.

在简历中,以下是我需要执行的步骤.

  1. 找到我想要的用户相关联的所有用户ID(id_user1 = current_userid_user2 = current_useris_accepted!blocked)

  2. 返回user_ids的的foreach - >获取所有相关用户(忽略与当前用户协会)(确保它是accepted!blocked也).

我怎么能这样查询?

谢谢你的帮助.

Qua*_*noi 2

SELECT  CASE f2.id_user1 WHEN CASE f1.id_user1 WHEN $user THEN f1.id_user2 ELSE f1.id_user1 END THEN f2.id_user2 ELSE f2.id_user1 END
FROM    friends f1
JOIN    friends f2
ON      f2.id_user1 = CASE f1.id_user1 WHEN $user THEN f1.id_user2 ELSE f1.id_user1 END
        OR f2.id_user2 = CASE f1.id_user1 WHEN $user THEN f1.id_user2 ELSE f1.id_user1 END
WHERE   (f1.id_user1 = $user OR f1.id_user = $user)
        AND f1.is_accepted = 1
        AND f2.is_accepted = 1
        AND f1.is_blocked = 0
        AND f2.is_blocked = 0
        AND NOT (f1.id_user1, f1.id_user2) = (f2.id_user1, f2.id_user2)
Run Code Online (Sandbox Code Playgroud)

请注意,最好首先存储用户最少的用户,然后存储最大的用户。在这种情况下,查询会更简单。