如何在MySQL中将子查询结果的计数作为列返回

How to return count of sub-query results as column in mysql

我有一个名为users的表,每个用户的主键为user_id。

我还有另一个表,称为friends,该表将用户链接为其他用户,成为朋友。

此friends表具有两列user_id和friend_id。 user_id列始终是两个user_id中的较低者,以防止重复。

我想执行一个查询以从users表中获取所有字段,但还要返回一个用户与另一个用户的共有的共同朋友的数量,作为另一个列的称为common_friends_count的列中的计数。

因此,基本上,如果我想知道每个用户与user_id 5有多少个共同的朋友,查询将从用户表中选择全部,并为每个用户执行子查询以查找共同的朋友并将计数返回为common_friends_count


它不漂亮,但是能成功。.

1
2
3
4
5
6
7
8
9
10
11
SELECT `u`.`user_id`, `f`.`friend_id`, `m`.`mutualFriends`
FROM `users` as `u`, `friends` as `f`
JOIN (
   SELECT COUNT(*) as `mutualFriends`, `users`.`user_id`
   FROM `users`, `friends`
   WHERE `friends`.`user_id` = `users`.`user_id`
   GROUP BY `users`.`user_id`
   ) as `m`
   ON `m`.`user_id` = `f`.`friend_id`
WHERE `f`.`user_id` = `u`.`user_id`
AND `u`.`user_id` = 5;


不确定这是做您想要的事情的最简单或最有效的方法,但是它可以工作:

1
2
3
4
5
6
select u.user_id, count(1)
from users u
join friends f on f.user_id = u.user_id or f.friend_id = u.user_id
join friends mutual on (mutual.user_id = 5 and mutual.friend_id = f.friend_id and mutual.friend_id != u.user_id) or (mutual.friend_id = 5 and mutual.user_id = f.user_id and mutual.user_id != u.user_id)
where u.user_id != 5
group by u.user_id