【问题标题】:SQL Server advanced joining: select records based on a three way user relationshipSQL Server 高级连接:基于三向用户关系选择记录
【发布时间】:2015-10-14 19:58:59
【问题描述】:

我有一个包含用户 ID 和名称的用户表。

我有一个包含 UserID1 和 UserID2 的 Likes 表。

当 User1 喜欢 User2 时,他们的 ID 会分别输入到 Likes 表中。

情景:

User1 喜欢 User2 和 User2 喜欢 User1 - 相互关系。

我想向 User1 建议与 User2 有相互关系的所有其他用户,他们也喜欢 User1,但 User1 还不喜欢他们。喜欢他们会形成三向关系。

返回 User2 和 User3 的 UserID 以及 User1 的所有其他潜在三向关系的 SQL 查询是什么

这是我目前所拥有的,但它并不能 100% 工作,因为它目前建议的用户一开始甚至不喜欢 User1

SELECT 
    DISTINCT a.[UserID2] as id_mylike, [user].[id] as id_theylike
FROM dbo.[likes] a 
JOIN dbo.[likes] b ON a.[UserID1] = b.[UserID2] 
JOIN dbo.[user] c ON a.[UserID2] = c.[id] 
JOIN dbo.[user] d ON a.[UserID1] = d.[id] AND a.[UserID2] = b.[UserID1] 
JOIN dbo.[user_likes] f on a.[UserID2] = f.[UserID1] 
JOIN dbo.[user] [user] ON f.[UserID2] = [user].[id] AND [user].[id] IN 
(
    SELECT 
        a.[UserID1] 
    FROM dbo.[likes] a 
    LEFT JOIN dbo.[user] c ON a.[UserID1] = c.[id] 
    WHERE a.[UserID2] = @userID 
    AND a.[UserID1] NOT IN 
    (
        SELECT a.[UserID1] 
        FROM dbo.[likes] a 
        LEFT JOIN dbo.[likes] b ON a.[UserID2] = b.[UserID1] 
        LEFT JOIN dbo.[user] c ON a.[UserID1] = c.[id] 
        JOIN dbo.[user] d ON a.[UserID2] = d.[id] AND a.[UserID1] = b.[UserID2] 
        WHERE a.[UserID2] = @userID 
    ) 
)

WHERE a.[UserID1] = @userID 

【问题讨论】:

  • 请在sqlfiddle.com 或问题本身中与我们分享一些 DDL。到目前为止,您尝试过什么?

标签: sql-server join


【解决方案1】:

我找到了这个解决方案(也许可以写得更简洁一些,不过这种方式很好理解)。

实际上,我创建了一个包含三列(UserA、UserB、UserC)的新表,含义如下:

"Tell UserA that his friend UserB has a friend UserC"

查询是:

SELECT A.UserID1 AS UserA, A.UserID2 AS UserB, B.UserID2 AS UserC
FROM   LikesTable AS A
JOIN   LikesTable AS B
ON     A.UserID2 = B.UserID1 AND UserID1 <> UserID2

UNION

SELECT A.UserID1 AS UserA, A.UserID2 AS UserB, B.UserID1 AS UserC
FROM   LikesTable AS A
JOIN   LikesTable AS B
ON     A.UserID2 = B.UserID2 AND UserID1 <> UserID1

UNION

SELECT A.UserID2 AS UserA, A.UserID1 AS UserB, B.UserID2 AS UserC
FROM   LikesTable AS A
JOIN   LikesTable AS B
ON     A.UserID1 = B.UserID1 AND UserID2 <> UserID2

UNION

SELECT A.UserID2 AS UserA, A.UserID1 AS UserB, B.UserID1 AS UserC
FROM   LikesTable AS A
JOIN   LikesTable AS B
ON     A.UserID1 = B.UserID2 AND UserID2 <> UserID1

ORDER BY UserA, UserB, UserC

在第一个 SELECT 中,我检查了 User1,并在他的朋友 User2 和表中与我的 User1 不同的所有其他 User1 之间进行 JOIN。

然后,我检查 User1 的朋友在 User2 中有一个朋友,依此类推。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    相关资源
    最近更新 更多