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

时间:2011-09-12 14:02:26

标签: mysql

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

我有另一个名为friends的表,它将用户作为朋友链接到其他用户。

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

我想进行查询以获取users表中的所有字段,但也返回用户与另一个用户有多少共同朋友作为另一列名为mutual_friends_count的计数。

所以基本上如果我想知道每个用户与user_id 5共有多少个mututal朋友,查询将从users表中选择所有,并为每个用户做一个子查询以找到共同的朋友并将计数作为mutual_friends_count返回

2 个答案:

答案 0 :(得分:1)

这不是很漂亮,但它可以解决问题..

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 :(得分:0)

不确定这是否是最简单或最有效的方法,但它确实有效:

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