当我有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`
答案 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。
希望这有帮助。