查找 user2 的好友 + 与 user1 的相互计数

Posted

技术标签:

【中文标题】查找 user2 的好友 + 与 user1 的相互计数【英文标题】:find user2 friends + mutual count with user1 【发布时间】:2018-05-11 15:05:46 【问题描述】:

mysql 查找 user2 的好友并获取与 user1 的相互计数(每个 user2 的好友)

表用户

user_id |   username
------------------
1       |   user1
2       |   user2
3       |   user3
4       |   user4
5       |   user5

桌友

user_one_id |   user_two_id
------------------------
1           |   2
1           |   4
2           |   3
2           |   4
3           |   1
5           |   2

预期输出 //( user2 friends : check result user_id with user1 to get mutual count)

user_id | mutual_count
------------------------
1       |   2             // user1 and user1 mutual `users(user2,user3,user4)`
3       |   1             // user3 and user1 mutual users(user2)
4       |   1             // user4 and user1 mutual users(user2)
5       |   0             // user5 and user1 -> No mutual users

mysql语句

SELECT  users.user_id,

    (SELECT count(a.friendID) FROM
        (   SELECT user_two_id friendID FROM friends  WHERE user_one_id = users.user_id
            UNION 
            SELECT user_one_id friendID FROM friends WHERE user_two_id = users.user_id
        ) AS a 
        JOIN  
        (   SELECT user_two_id friendID FROM friends WHERE user_one_id = 1
            UNION 
            SELECT user_one_id friendID FROM friends WHERE user_two_id = 1
        ) AS b 
        ON  a.friendID = b.friendID
    ) as mutual_count

FROM friends LEFT JOIN  users    
ON friends.user_one_id = users.user_id or  friends.user_two_id = users.user_id  
WHERE (friends.user_one_id = 2 OR friends.user_two_id = 2)   AND users.user_id != 2

我得到的错误 'where 子句'中的未知列'users.user_id' 获取mutual_count的问题子查询无法知道users.user_id

任何帮助表示赞赏

【问题讨论】:

我找到了 user2 的好友,那为什么 user2 会出现在结果中? 和user1的结果好友相互计数 【参考方案1】:

您在朋友表之间使用联合的预感是正确的。这里的问题是朋友之间的关系只记录在一个方向上,但我们确实需要检测每个关系而不考虑方向。 UNION 技巧允许正确计算每个关系。

在下面的查询中,基表是这个联合。我们自行加入它,条件是:

第一个表的user_one_id是2 第一个表的user_two_id第二个 表的user_one_id 匹配 第二张表的user_two_id不是 2,这只是一个循环回到我们开始的地方

然后,我们只需按第一个表的user_two_id 聚合并计算不同朋友的数量即可得到结果。

SELECT
    t1.user_two_id AS user_id,
    COUNT(DISTINCT t2.user_two_id) AS mutual_count
FROM
(
    SELECT user_one_id, user_two_id
    FROM friends
    UNION ALL
    SELECT user_two_id, user_one_id
    FROM friends
) t1
LEFT JOIN
(
    SELECT user_one_id, user_two_id
    FROM friends
    UNION ALL
    SELECT user_two_id, user_one_id
    FROM friends
) t2
    ON t1.user_one_id = 2 AND
       t1.user_two_id = t2.user_one_id AND
       t2.user_two_id <> 2
WHERE
    t1.user_two_id <> 2
GROUP BY
    t1.user_two_id
ORDER BY
    t1.user_two_id;

Demo

【讨论】:

不 - 你得到 user2 与所有朋友 cout 的朋友,但我想让这个朋友共同的朋友与 user1 一起计数 @khalidseleem 我修好了。我现在正在使用手机,感谢您的耐心等待。 我知道我想要的结果,但是我在我指定 user1 #1 的地方,我想在 statemnt 中使用 1 @khalidseleem 用户 # 在我的查询中的三个位置被硬编码。如果您不知道如何将其更改为其他用户,那么您应该在继续之前查看基本 SQL。 我想在语句中确定用户 2 和用户 1,并且还想将它与用户表连接起来,因为我想从中获取一些字段

以上是关于查找 user2 的好友 + 与 user1 的相互计数的主要内容,如果未能解决你的问题,请参考以下文章

ORM:友谊/好友关系

user1的权限被拒绝给user2

Ranorex 安装

错误:对 user1/repo.git 的权限拒绝给 user2

SQL查找互惠关系

具有1:n关系的SQL查询,查找具有两个匹配子项匹配的所有实体