Mysqli查询计算总朋友数

时间:2013-05-28 13:40:37

标签: mysql mysqli

当我有users的表格时:

id | login
1    Mike
2    Janet
3    Bruce

我有一张名为friendlist的友谊表:

id | user | friend
1    1      2 // Mike is friend with Janet
2    2      1 // Janet accepted, created the friendship!
3    1      3 // Mike is friend with Bruce
4    3      1 // Bruce accepted!

现在,Mike有 2 好友,Janet 1 ,Bruce 1

我会运行什么查询来计算这样的朋友数量?

这不是作业。我几个小时都在苦苦挣扎,无法做到这一点。

一个适合我的查询,但返回的结果不正确(比朋友更多的朋友):

SELECT `users`.`id`, `login`, COUNT(`a`.`id`)
FROM `users`
LEFT JOIN(
   SELECT user AS `id` FROM `friendlist`
   UNION ALL 
   SELECT friend     FROM `friendlist`
) as `a` ON `a`.`id` = `users`.`id`
GROUP BY `users`.`id`

2 个答案:

答案 0 :(得分:2)

鉴于您在以下帖子中的评论,其中必须要求朋友,然后油炸必须接受,我已更新我的答案:

SELECT U.Id, U.Login, COUNT(DISTINCT FL2.Id) 
FROM Users U
    LEFT JOIN FriendList FL ON U.Id = FL.User
    LEFT JOIN FriendList FL2 ON 
        FL.friend = FL2.user AND FL2.friend = U.Id
GROUP BY U.Id

我已经包含使用DISTINCT以防可能存在重复行 - 可能不是这种情况。

另外,为了澄清使用COUNT(*)COUNT(FL2.Id)之间的区别,这些是两个不同的陈述。使用COUNT(*)将取消LEFT JOIN并将所有行作为朋友计数返回。

答案 1 :(得分:0)

我会创建一个函数,它将返回2个声明变量的总计数。第一个变量包含来自用户列的计数,另一个来自朋友。

1  DELIMITER ;;
2  CREATE FUNCTION `Friendships`(k int) RETURNS int(11)
3  BEGIN
4    DECLARE user int;
5    DECLARE friends int;
6    SELECT count(*) from friendlist WHERE friendlist.user = k into user;
7    SELECT count(*) from friendlist WHERE friendlist.friends = k into friends;
8    RETURN user + friends;
9  END ;;
10 DELIMITER ;

所以最后我会调用我的函数并给它一个用户的id(参数),我想知道多少友谊。

SELECT friendships(1);

从您的示例结果将是4。

希望这有帮助。