0

当我有一张桌子时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!

现在,迈克有2 个朋友,珍妮特有1 个,布鲁斯有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`
4

2 回答 2

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(*)vs之间的区别COUNT(FL2.Id),这是两种不同的陈述。使用COUNT(*)将否定LEFT JOIN并返回所有行作为朋友计数。

于 2013-05-28T13:43:06.620 回答
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。

希望这可以帮助。

于 2017-06-18T08:01:02.083 回答