查找 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 的相互计数的主要内容,如果未能解决你的问题,请参考以下文章